optimize the details

FFIB 6 jaren geleden
bovenliggende
commit
44ea034cae
147 gewijzigde bestanden met toevoegingen van 482 en 851 verwijderingen
  1. BIN
      PaiAi/.DS_Store
  2. 19 55
      PaiAi/Paiai.xcodeproj/project.pbxproj
  3. BIN
      PaiAi/Paiai.xcodeproj/project.xcworkspace/xcuserdata/FFIB.xcuserdatad/UserInterfaceState.xcuserstate
  4. BIN
      PaiAi/Paiai/Assets.xcassets/.DS_Store
  5. 0 0
      PaiAi/Paiai/Assets.xcassets/Common/icon-comment.imageset/Contents.json
  6. 0 0
      PaiAi/Paiai/Assets.xcassets/Common/icon-comment.imageset/icon-评论-2.png
  7. 0 0
      PaiAi/Paiai/Assets.xcassets/Common/icon-thumbup.imageset/Contents.json
  8. 0 0
      PaiAi/Paiai/Assets.xcassets/Common/icon-thumbup.imageset/icon-赞-2.png
  9. 21 0
      PaiAi/Paiai/Assets.xcassets/Common/logo.imageset/Contents.json
  10. BIN
      PaiAi/Paiai/Assets.xcassets/Common/logo.imageset/Logo@3x.png
  11. BIN
      PaiAi/Paiai/Assets.xcassets/MainPage/.DS_Store
  12. 0 21
      PaiAi/Paiai/Assets.xcassets/MainPage/FEED_λ_.imageset/Contents.json
  13. BIN
      PaiAi/Paiai/Assets.xcassets/MainPage/FEED_λ_.imageset/FEED_λ_@3x.png
  14. 0 0
      PaiAi/Paiai/Assets.xcassets/module/Contents.json
  15. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-add.imageset/BTN-新增.png
  16. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-add.imageset/Contents.json
  17. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-camera.imageset/BTN-拍照.png
  18. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-camera.imageset/Contents.json
  19. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-delete.imageset/Contents.json
  20. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-delete.imageset/delete.png
  21. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-flash.imageset/Contents.json
  22. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-flash.imageset/闪光灯-默认70%透明度,按压100%.png
  23. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-photoAlbum.imageset/Contents.json
  24. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-photoAlbum.imageset/从相册选取-默认70%透明度,按压100%.png
  25. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-scanQR.imageset/BTN-扫码.png
  26. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/BTN-scanQR.imageset/Contents.json
  27. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/Contents.json
  28. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/空白页-无内容.imageset/Contents.json
  29. 0 0
      PaiAi/Paiai/Assets.xcassets/module/home/空白页-无内容.imageset/空白页-无内容.png
  30. 0 0
      PaiAi/Paiai/Assets.xcassets/module/login/BTN-weixin.imageset/Contents.json
  31. 0 0
      PaiAi/Paiai/Assets.xcassets/module/login/BTN-weixin.imageset/FE4EEB304DC91AB1789FFFA9B1AA4A03.png
  32. 0 0
      PaiAi/Paiai/Assets.xcassets/module/login/Contents.json
  33. 0 0
      PaiAi/Paiai/Assets.xcassets/module/login/guide1.imageset/8778FB9773576108C6D5109F23D69C69.png
  34. 0 0
      PaiAi/Paiai/Assets.xcassets/module/login/guide1.imageset/Contents.json
  35. 0 0
      PaiAi/Paiai/Assets.xcassets/module/login/guide2.imageset/A4494A157AB20FA47B8B96993319B3E9.png
  36. 0 0
      PaiAi/Paiai/Assets.xcassets/module/login/guide2.imageset/Contents.json
  37. 0 0
      PaiAi/Paiai/Assets.xcassets/module/login/guide3.imageset/862B9012863929D278CBEF1E3A118E6D.png
  38. 0 0
      PaiAi/Paiai/Assets.xcassets/module/login/guide3.imageset/Contents.json
  39. 0 0
      PaiAi/Paiai/Assets.xcassets/module/message/Contents.json
  40. 0 0
      PaiAi/Paiai/Assets.xcassets/module/message/message-comment.imageset/Contents.json
  41. 0 0
      PaiAi/Paiai/Assets.xcassets/module/message/message-comment.imageset/消息-评论.png
  42. 0 0
      PaiAi/Paiai/Assets.xcassets/module/message/message-system.imageset/Contents.json
  43. 0 0
      PaiAi/Paiai/Assets.xcassets/module/message/message-system.imageset/消息-官方提示.png
  44. 0 0
      PaiAi/Paiai/Assets.xcassets/module/message/message-thumpub.imageset/Contents.json
  45. 0 0
      PaiAi/Paiai/Assets.xcassets/module/message/message-thumpub.imageset/消息-赞.png
  46. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/BTN-logout.imageset/Contents.json
  47. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/BTN-logout.imageset/注销切图@3x.png
  48. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/Contents.json
  49. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/about-contactUs.imageset/Contents.json
  50. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/about-contactUs.imageset/我的-客服 @3x.png
  51. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/about-score.imageset/Contents.json
  52. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/about-score.imageset/关于-用户协议 @3x.png
  53. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/about-userAgreement.imageset/Contents.json
  54. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/about-userAgreement.imageset/关于-用户协议 @3x.png
  55. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/mine-about.imageset/Contents.json
  56. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/mine-about.imageset/关于@3x.png
  57. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/mine-feedback.imageset/Contents.json
  58. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/mine-feedback.imageset/我的-意见反馈 copy.png
  59. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/mine-group.imageset/Contents.json
  60. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/mine-group.imageset/群组@3x.png
  61. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/mine-order.imageset/Contents.json
  62. 0 0
      PaiAi/Paiai/Assets.xcassets/module/mine/mine-order.imageset/订单@3x.png
  63. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-comment.imageset/BTN-评论.png
  64. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-comment.imageset/Contents.json
  65. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-download.imageset/Contents.json
  66. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-download.imageset/大图模式-下载.png
  67. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-enterGroup.imageset/Contents.json
  68. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-enterGroup.imageset/进入群.png
  69. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-rotate.imageset/Contents.json
  70. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-rotate.imageset/旋转.png
  71. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-share.imageset/BTN-分享.png
  72. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-share.imageset/Contents.json
  73. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-thumbup.imageset/Contents.json
  74. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-thumbup.imageset/Oval 491.png
  75. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/Contents.json
  76. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-purchase-watermark.imageset/Contents.json
  77. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-purchase-watermark.imageset/购买-去水印.png
  78. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-time.imageset/Contents.json
  79. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-time.imageset/icon-记录.png
  80. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/purchase-background.imageset/Contents.json
  81. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/purchase-background.imageset/获取高清图.png
  82. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/Contents.json
  83. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-QQ.imageset/Contents.json
  84. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-QQ.imageset/分享-QQ.png
  85. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-weibo.imageset/Contents.json
  86. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-weibo.imageset/分享-微博.png
  87. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wx.imageset/Contents.json
  88. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wx.imageset/分享-微信好友.png
  89. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wxCircle.imageset/Contents.json
  90. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wxCircle.imageset/分享-朋友圈.png
  91. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/去除水印.imageset/Contents.json
  92. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/去除水印.imageset/去除水印.png
  93. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/提示弹窗-勾.imageset/Contents.json
  94. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/提示弹窗-勾.imageset/提示弹窗-勾.png
  95. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/收起.imageset/Contents.json
  96. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/收起.imageset/列表箭头.png
  97. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/购买-HD.imageset/Contents.json
  98. 0 0
      PaiAi/Paiai/Assets.xcassets/module/photoDetail/购买-HD.imageset/购买-HD.png
  99. BIN
      PaiAi/PaiaiDataKit/.DS_Store
  100. 1 1
      PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/GroupRemoteAPI.swift
  101. 1 1
      PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/MessageRemoteAPI.swift
  102. 2 1
      PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/OrderRemoteAPI.swift
  103. 4 6
      PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/NetworkApi.swift
  104. 0 42
      PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/Result.swift
  105. 1 7
      PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/StatusResource.swift
  106. 10 14
      PaiAi/PaiaiDataKit/PresentLayer/Message/MessageListViewModel.swift
  107. 1 6
      PaiAi/PaiaiDataKit/PresentLayer/Mine/MineGroupViewModel.swift
  108. 4 3
      PaiAi/PaiaiDataKit/Resuable/DataError.swift
  109. 1 1
      PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/FadeToastAnimator.swift
  110. 1 1
      PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/Toast.swift
  111. 1 1
      PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/ToastAnimator.swift
  112. 1 1
      PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/ToastOption.swift
  113. 6 1
      PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/ToastView.swift
  114. 6 0
      PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIImageExt.swift
  115. 3 22
      PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UITextViewExt.swift
  116. 0 187
      PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/FFAlertController.swift
  117. 0 21
      PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/Views/FFAlertControllerRepresentable.swift
  118. 0 29
      PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/Views/FFAlertLabel.swift
  119. 0 41
      PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/Views/FFSheetActionCell.swift
  120. 31 0
      PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/ActionSheetView.swift
  121. 1 0
      PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/AlertAction/AlertItem.swift
  122. 0 32
      PaiAi/PaiaiUIKit/Reusable/UIKit/FFProgress.swift
  123. 1 1
      PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/GestureRecoginzier+NavigationBack.swift
  124. 6 0
      PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerDelegate.swift
  125. 5 0
      PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerProxy.swift
  126. 0 6
      PaiAi/Paiai_iOS/App/AppCoordinator.swift
  127. 18 0
      PaiAi/Paiai_iOS/App/CoordinatorKey.swift
  128. 2 2
      PaiAi/Paiai_iOS/App/Group/Group.storyboard
  129. 3 3
      PaiAi/Paiai_iOS/App/Group/GroupCoordinator.swift
  130. 2 2
      PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupDetail.storyboard
  131. 2 1
      PaiAi/Paiai_iOS/App/Group/GroupViewController.swift
  132. 0 7
      PaiAi/Paiai_iOS/App/Home/HomeCoordinator.swift
  133. 2 1
      PaiAi/Paiai_iOS/App/Home/HomeViewController.swift
  134. 10 10
      PaiAi/Paiai_iOS/App/Home/Main.storyboard
  135. 11 7
      PaiAi/Paiai_iOS/App/Message/Message.storyboard
  136. 20 16
      PaiAi/Paiai_iOS/App/Message/MessageListViewController.swift
  137. 95 121
      PaiAi/Paiai_iOS/App/Mine/Mine.storyboard
  138. 2 2
      PaiAi/Paiai_iOS/App/Mine/MineCoordinator.swift
  139. 14 8
      PaiAi/Paiai_iOS/App/Mine/MineFeedbackViewController.swift
  140. 4 3
      PaiAi/Paiai_iOS/App/Mine/MineGroupViewController.swift
  141. 8 10
      PaiAi/Paiai_iOS/App/Mine/MineOrderViewController.swift
  142. 4 4
      PaiAi/Paiai_iOS/App/PhotoCell.xib
  143. 131 98
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetail.storyboard
  144. 2 2
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailCoordinator.swift
  145. 13 12
      PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailViewController.swift
  146. 12 12
      PaiAi/Paiai_iOS/App/PhotoDetail/ShareController.swift
  147. 0 29
      PaiAi/Paiai_iOS/App/PhotoDetail/ShareView.swift

BIN
PaiAi/.DS_Store


+ 19 - 55
PaiAi/Paiai.xcodeproj/project.pbxproj

@@ -97,7 +97,6 @@
97 97
 		0513102521CA1B67004EF1BE /* NetworkApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0505B34F1F7E4B9A009E4ED2 /* NetworkApi.swift */; };
98 98
 		0513102621CA1B67004EF1BE /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0505B34B1F7E4024009E4ED2 /* Resource.swift */; };
99 99
 		0513102821CA1B67004EF1BE /* NetWorkCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFA811E7002B50006FEE0 /* NetWorkCache.swift */; };
100
-		0513102921CA1B67004EF1BE /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0594845921B66DA500074EFC /* Result.swift */; };
101 100
 		0513102B21CA1B67004EF1BE /* HomeRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAD61E70047E0006FEE0 /* HomeRepository.swift */; };
102 101
 		0513102C21CA1B67004EF1BE /* OrderRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = A69FFAED1E70047E0006FEE0 /* OrderRepository.swift */; };
103 102
 		0513102D21CA1B67004EF1BE /* GroupPhotoRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0540C8B01F8C9A640044FCC5 /* GroupPhotoRepository.swift */; };
@@ -138,14 +137,10 @@
138 137
 		0513106721CA290B004EF1BE /* DateExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543274721C68C1900C6388D /* DateExt.swift */; };
139 138
 		0513106921CA34D6004EF1BE /* GroupDetailCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106821CA34D6004EF1BE /* GroupDetailCoordinator.swift */; };
140 139
 		0513106B21CA3545004EF1BE /* PhotoDetailCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106A21CA3545004EF1BE /* PhotoDetailCoordinator.swift */; };
141
-		0513107C21CA3907004EF1BE /* FFAlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106D21CA3907004EF1BE /* FFAlertController.swift */; };
142 140
 		0513107D21CA3907004EF1BE /* CancelAlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513106F21CA3907004EF1BE /* CancelAlertAction.swift */; };
143
-		0513107E21CA3907004EF1BE /* FFAlertControllerRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107021CA3907004EF1BE /* FFAlertControllerRepresentable.swift */; };
144 141
 		0513107F21CA3907004EF1BE /* DestructiveAlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107121CA3907004EF1BE /* DestructiveAlertAction.swift */; };
145 142
 		0513108021CA3907004EF1BE /* ActionSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107221CA3907004EF1BE /* ActionSheetView.swift */; };
146 143
 		0513108121CA3907004EF1BE /* ConfirmAlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107321CA3907004EF1BE /* ConfirmAlertAction.swift */; };
147
-		0513108221CA3907004EF1BE /* FFSheetActionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107421CA3907004EF1BE /* FFSheetActionCell.swift */; };
148
-		0513108321CA3907004EF1BE /* FFAlertLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513107521CA3907004EF1BE /* FFAlertLabel.swift */; };
149 144
 		0513109321CA3915004EF1BE /* ColorQR.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513108A21CA3914004EF1BE /* ColorQR.swift */; };
150 145
 		0513109421CA3915004EF1BE /* QRCodeMaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513108B21CA3914004EF1BE /* QRCodeMaskView.swift */; };
151 146
 		0513109521CA3915004EF1BE /* QRCodeScanDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0513108C21CA3914004EF1BE /* QRCodeScanDelegate.swift */; };
@@ -166,7 +161,6 @@
166 161
 		051310B621CB675A004EF1BE /* UIImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543276621C68C3300C6388D /* UIImageView+Kingfisher.swift */; };
167 162
 		051310B821CB6958004EF1BE /* UserInfoStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051310B721CB6958004EF1BE /* UserInfoStore.swift */; };
168 163
 		051310C021CB6EF4004EF1BE /* UserInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 051310BF21CB6EF4004EF1BE /* UserInfo.swift */; };
169
-		0521145421F083F20047C55A /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0521145321F083F20047C55A /* ToastView.swift */; };
170 164
 		052BF1C821E344020010D270 /* PullToRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052BF1C721E344020010D270 /* PullToRefresh.framework */; };
171 165
 		052BF1C921E344280010D270 /* PullToRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052BF1C721E344020010D270 /* PullToRefresh.framework */; };
172 166
 		0530951B221AB3EC00408D34 /* GroupDetailMemeberView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0530951A221AB3EC00408D34 /* GroupDetailMemeberView.swift */; };
@@ -174,11 +168,7 @@
174 168
 		0535D6DB21D32A9E008D9403 /* GuestUserInfoRemoteAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0535D6DA21D32A9E008D9403 /* GuestUserInfoRemoteAPI.swift */; };
175 169
 		053E126521F1718E00A64893 /* PageOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126421F1718E00A64893 /* PageOption.swift */; };
176 170
 		053E126721F1719F00A64893 /* PageItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126621F1719F00A64893 /* PageItem.swift */; };
177
-		053E126921F171C500A64893 /* ToastOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126821F171C500A64893 /* ToastOption.swift */; };
178
-		053E126B21F5696E00A64893 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126A21F5696E00A64893 /* Toast.swift */; };
179
-		053E126D21F5767300A64893 /* ToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126C21F5767300A64893 /* ToastAnimator.swift */; };
180
-		053E126F21F5774700A64893 /* FadeToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126E21F5774700A64893 /* FadeToastAnimator.swift */; };
181
-		053E127521F5A72000A64893 /* DataError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E127421F5A72000A64893 /* DataError.swift */; };
171
+		053E127521F5A72000A64893 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E127421F5A72000A64893 /* Error.swift */; };
182 172
 		053E127821F5B6E400A64893 /* AlertController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E127721F5B6E400A64893 /* AlertController.swift */; };
183 173
 		0543E7F421CB911200A42807 /* UserInfoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E7F321CB911200A42807 /* UserInfoViewModel.swift */; };
184 174
 		0543E80721D0CDFA00A42807 /* MineFeedbackViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80621D0CDFA00A42807 /* MineFeedbackViewModel.swift */; };
@@ -186,7 +176,6 @@
186 176
 		0543E80D21D1E2EA00A42807 /* PhotoGroupDetailRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80C21D1E2EA00A42807 /* PhotoGroupDetailRepository.swift */; };
187 177
 		0543E80F21D1FD1100A42807 /* GroupDetailItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0543E80E21D1FD1100A42807 /* GroupDetailItem.swift */; };
188 178
 		0546D9852242460700742939 /* OriginData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0546D9842242460700742939 /* OriginData.swift */; };
189
-		0546D98E2243782300742939 /* ShareView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0546D98D2243782300742939 /* ShareView.swift */; };
190 179
 		054B6C45223F884600939FE6 /* PhotoDetailRemoteAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054B6C44223F884600939FE6 /* PhotoDetailRemoteAPI.swift */; };
191 180
 		054B6C46223F966A00939FE6 /* RxDataSources.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05130FC421CA1997004EF1BE /* RxDataSources.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
192 181
 		05594BFF2240BEDE002D4910 /* PhotoDetailListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05594BFE2240BEDE002D4910 /* PhotoDetailListViewModel.swift */; };
@@ -217,6 +206,12 @@
217 206
 		0584FD7721F9C8A300FA1E3E /* PresentAnimatorDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7621F9C8A300FA1E3E /* PresentAnimatorDelegate.swift */; };
218 207
 		0584FD7C21FABC1400FA1E3E /* PresentExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7B21FABC1400FA1E3E /* PresentExtension.swift */; };
219 208
 		0584FD7E21FABD9D00FA1E3E /* PresentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0584FD7D21FABD9D00FA1E3E /* PresentViewController.swift */; };
209
+		058D0C9D2249C94F006CA488 /* CoordinatorKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */; };
210
+		058D0CA02249FCF6006CA488 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126A21F5696E00A64893 /* Toast.swift */; };
211
+		058D0CA12249FCF6006CA488 /* ToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0521145321F083F20047C55A /* ToastView.swift */; };
212
+		058D0CA22249FCF6006CA488 /* ToastOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126821F171C500A64893 /* ToastOption.swift */; };
213
+		058D0CA32249FCF6006CA488 /* ToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126C21F5767300A64893 /* ToastAnimator.swift */; };
214
+		058D0CA42249FCF6006CA488 /* FadeToastAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053E126E21F5774700A64893 /* FadeToastAnimator.swift */; };
220 215
 		059B589F21F7103100FA64C2 /* AlertItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B589E21F7103100FA64C2 /* AlertItem.swift */; };
221 216
 		059B58A621F7235D00FA64C2 /* AlertAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B58A521F7235D00FA64C2 /* AlertAction.swift */; };
222 217
 		059B58A821F83B1600FA64C2 /* CenterCancelItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 059B58A721F83B1600FA64C2 /* CenterCancelItem.swift */; };
@@ -370,14 +365,10 @@
370 365
 		0513106121CA22B5004EF1BE /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = Carthage/Build/iOS/Alamofire.framework; sourceTree = "<group>"; };
371 366
 		0513106821CA34D6004EF1BE /* GroupDetailCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupDetailCoordinator.swift; sourceTree = "<group>"; };
372 367
 		0513106A21CA3545004EF1BE /* PhotoDetailCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoDetailCoordinator.swift; sourceTree = "<group>"; };
373
-		0513106D21CA3907004EF1BE /* FFAlertController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFAlertController.swift; sourceTree = "<group>"; };
374 368
 		0513106F21CA3907004EF1BE /* CancelAlertAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CancelAlertAction.swift; sourceTree = "<group>"; };
375
-		0513107021CA3907004EF1BE /* FFAlertControllerRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFAlertControllerRepresentable.swift; sourceTree = "<group>"; };
376 369
 		0513107121CA3907004EF1BE /* DestructiveAlertAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DestructiveAlertAction.swift; sourceTree = "<group>"; };
377 370
 		0513107221CA3907004EF1BE /* ActionSheetView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionSheetView.swift; sourceTree = "<group>"; };
378 371
 		0513107321CA3907004EF1BE /* ConfirmAlertAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConfirmAlertAction.swift; sourceTree = "<group>"; };
379
-		0513107421CA3907004EF1BE /* FFSheetActionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFSheetActionCell.swift; sourceTree = "<group>"; };
380
-		0513107521CA3907004EF1BE /* FFAlertLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FFAlertLabel.swift; sourceTree = "<group>"; };
381 372
 		0513108A21CA3914004EF1BE /* ColorQR.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorQR.swift; sourceTree = "<group>"; };
382 373
 		0513108B21CA3914004EF1BE /* QRCodeMaskView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRCodeMaskView.swift; sourceTree = "<group>"; };
383 374
 		0513108C21CA3914004EF1BE /* QRCodeScanDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRCodeScanDelegate.swift; sourceTree = "<group>"; };
@@ -403,7 +394,7 @@
403 394
 		053E126A21F5696E00A64893 /* Toast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toast.swift; sourceTree = "<group>"; };
404 395
 		053E126C21F5767300A64893 /* ToastAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToastAnimator.swift; sourceTree = "<group>"; };
405 396
 		053E126E21F5774700A64893 /* FadeToastAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FadeToastAnimator.swift; sourceTree = "<group>"; };
406
-		053E127421F5A72000A64893 /* DataError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataError.swift; sourceTree = "<group>"; };
397
+		053E127421F5A72000A64893 /* Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Error.swift; sourceTree = "<group>"; };
407 398
 		053E127721F5B6E400A64893 /* AlertController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertController.swift; sourceTree = "<group>"; };
408 399
 		0540C8B01F8C9A640044FCC5 /* GroupPhotoRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupPhotoRepository.swift; sourceTree = "<group>"; };
409 400
 		0540C8B21F8CA07E0044FCC5 /* FileModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileModel.swift; sourceTree = "<group>"; };
@@ -428,7 +419,6 @@
428 419
 		0543E80E21D1FD1100A42807 /* GroupDetailItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GroupDetailItem.swift; sourceTree = "<group>"; };
429 420
 		05468AF11F8B73A000B8F469 /* PhotoItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoItem.swift; sourceTree = "<group>"; };
430 421
 		0546D9842242460700742939 /* OriginData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OriginData.swift; sourceTree = "<group>"; };
431
-		0546D98D2243782300742939 /* ShareView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareView.swift; sourceTree = "<group>"; };
432 422
 		054863661FA326CB00A39DA0 /* PhotoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoCell.swift; sourceTree = "<group>"; };
433 423
 		054863671FA326CB00A39DA0 /* PhotoCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PhotoCell.xib; sourceTree = "<group>"; };
434 424
 		054B6C44223F884600939FE6 /* PhotoDetailRemoteAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoDetailRemoteAPI.swift; sourceTree = "<group>"; };
@@ -459,8 +449,8 @@
459 449
 		0584FD7621F9C8A300FA1E3E /* PresentAnimatorDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentAnimatorDelegate.swift; sourceTree = "<group>"; };
460 450
 		0584FD7B21FABC1400FA1E3E /* PresentExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentExtension.swift; sourceTree = "<group>"; };
461 451
 		0584FD7D21FABD9D00FA1E3E /* PresentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PresentViewController.swift; sourceTree = "<group>"; };
452
+		058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoordinatorKey.swift; sourceTree = "<group>"; };
462 453
 		0594845721B528FE00074EFC /* Interfaces.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Interfaces.swift; sourceTree = "<group>"; };
463
-		0594845921B66DA500074EFC /* Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = "<group>"; };
464 454
 		059AA5D921BA1A2000485188 /* MessageCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageCoordinator.swift; sourceTree = "<group>"; };
465 455
 		059AA62821BA855000485188 /* MessageRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageRepository.swift; sourceTree = "<group>"; };
466 456
 		059AA62A21BA85B000485188 /* MessageViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageViewModel.swift; sourceTree = "<group>"; };
@@ -662,11 +652,9 @@
662 652
 			children = (
663 653
 				055BB53F220AEA4E009548AA /* Nibless */,
664 654
 				0584FD7A21FABA0300FA1E3E /* Present */,
665
-				0521145521F083FA0047C55A /* Toast */,
666 655
 				05C8D21E21EDD5A80001E847 /* NavigationBar */,
667 656
 				05C8D21721ED911D0001E847 /* NavigationBack */,
668 657
 				0513108921CA3914004EF1BE /* QR */,
669
-				0513106C21CA3907004EF1BE /* Alert */,
670 658
 				05130F4E21C94C12004EF1BE /* AlertViewController */,
671 659
 				05130F6121C94C79004EF1BE /* PageViewController */,
672 660
 				05130F5F21C94C79004EF1BE /* SideViewController */,
@@ -806,6 +794,7 @@
806 794
 		05130FBA21C9EE82004EF1BE /* App */ = {
807 795
 			isa = PBXGroup;
808 796
 			children = (
797
+				058D0C9C2249C94F006CA488 /* CoordinatorKey.swift */,
809 798
 				050E210F21B8CE8A008E1352 /* AppCoordinator.swift */,
810 799
 				05087F6721B8F9530024A117 /* ContainerViewController.swift */,
811 800
 				A69FFA791E7002970006FEE0 /* LoginViewController.swift */,
@@ -820,25 +809,6 @@
820 809
 			path = App;
821 810
 			sourceTree = "<group>";
822 811
 		};
823
-		0513106C21CA3907004EF1BE /* Alert */ = {
824
-			isa = PBXGroup;
825
-			children = (
826
-				0513106D21CA3907004EF1BE /* FFAlertController.swift */,
827
-				0513106E21CA3907004EF1BE /* Views */,
828
-			);
829
-			path = Alert;
830
-			sourceTree = "<group>";
831
-		};
832
-		0513106E21CA3907004EF1BE /* Views */ = {
833
-			isa = PBXGroup;
834
-			children = (
835
-				0513107021CA3907004EF1BE /* FFAlertControllerRepresentable.swift */,
836
-				0513107421CA3907004EF1BE /* FFSheetActionCell.swift */,
837
-				0513107521CA3907004EF1BE /* FFAlertLabel.swift */,
838
-			);
839
-			path = Views;
840
-			sourceTree = "<group>";
841
-		};
842 812
 		0513108921CA3914004EF1BE /* QR */ = {
843 813
 			isa = PBXGroup;
844 814
 			children = (
@@ -895,8 +865,9 @@
895 865
 		053E127221F5A6D400A64893 /* Resuable */ = {
896 866
 			isa = PBXGroup;
897 867
 			children = (
868
+				0521145521F083FA0047C55A /* Toast */,
898 869
 				053E127321F5A6E200A64893 /* Extension */,
899
-				053E127421F5A72000A64893 /* DataError.swift */,
870
+				053E127421F5A72000A64893 /* Error.swift */,
900 871
 			);
901 872
 			path = Resuable;
902 873
 			sourceTree = "<group>";
@@ -1212,7 +1183,6 @@
1212 1183
 				A69FFA9E1E7004700006FEE0 /* PhotoDetailCommentCell.swift */,
1213 1184
 				05594C022240E94E002D4910 /* PhotoDetailImageCell.swift */,
1214 1185
 				A69FFAA61E7004700006FEE0 /* ImageCell.swift */,
1215
-				0546D98D2243782300742939 /* ShareView.swift */,
1216 1186
 				A69FFAA81E7004700006FEE0 /* ShareController.swift */,
1217 1187
 				A69FFAA91E7004700006FEE0 /* PhotoPreviewViewController.swift */,
1218 1188
 				A69FFB881E7018CC0006FEE0 /* PhotoDetail.storyboard */,
@@ -1346,7 +1316,6 @@
1346 1316
 			children = (
1347 1317
 				0505B34F1F7E4B9A009E4ED2 /* NetworkApi.swift */,
1348 1318
 				0505B34B1F7E4024009E4ED2 /* Resource.swift */,
1349
-				0594845921B66DA500074EFC /* Result.swift */,
1350 1319
 				0594845721B528FE00074EFC /* Interfaces.swift */,
1351 1320
 				A69FFA811E7002B50006FEE0 /* NetWorkCache.swift */,
1352 1321
 			);
@@ -1626,7 +1595,6 @@
1626 1595
 				05C8D22421EED92F0001E847 /* NavigationBarPushAndPopDelegate.swift in Sources */,
1627 1596
 				05130FFD21CA1B39004EF1BE /* HardwareAuthorization.swift in Sources */,
1628 1597
 				0513107D21CA3907004EF1BE /* CancelAlertAction.swift in Sources */,
1629
-				053E126F21F5774700A64893 /* FadeToastAnimator.swift in Sources */,
1630 1598
 				05130FFE21CA1B39004EF1BE /* WaterfallFlowLayout.swift in Sources */,
1631 1599
 				05130FFF21CA1B39004EF1BE /* WaterfallFlowConfiguration.swift in Sources */,
1632 1600
 				055BB53E220AEA3B009548AA /* NiblessViewController.swift in Sources */,
@@ -1638,20 +1606,16 @@
1638 1606
 				0513100121CA1B39004EF1BE /* CGPointExt.swift in Sources */,
1639 1607
 				0584FD7521F9C70D00FA1E3E /* SideAnimator.swift in Sources */,
1640 1608
 				0584FD7721F9C8A300FA1E3E /* PresentAnimatorDelegate.swift in Sources */,
1641
-				0513108321CA3907004EF1BE /* FFAlertLabel.swift in Sources */,
1642 1609
 				0513107F21CA3907004EF1BE /* DestructiveAlertAction.swift in Sources */,
1643 1610
 				059B589F21F7103100FA64C2 /* AlertItem.swift in Sources */,
1644 1611
 				059B58A621F7235D00FA64C2 /* AlertAction.swift in Sources */,
1645 1612
 				0513109821CA3915004EF1BE /* QRCodeScanResult.swift in Sources */,
1646 1613
 				0513100221CA1B39004EF1BE /* CGSizeExt.swift in Sources */,
1647
-				053E126921F171C500A64893 /* ToastOption.swift in Sources */,
1648 1614
 				0513108121CA3907004EF1BE /* ConfirmAlertAction.swift in Sources */,
1649
-				0513108221CA3907004EF1BE /* FFSheetActionCell.swift in Sources */,
1650 1615
 				05C8D22221EED6860001E847 /* NavigationBarInteractiveViewController.swift in Sources */,
1651 1616
 				0513109A21CA3915004EF1BE /* QRCodeScanView.swift in Sources */,
1652 1617
 				0513100721CA1B39004EF1BE /* UIViewController+UIBarButtonItem.swift in Sources */,
1653 1618
 				05D3A3C621FF010900A29A20 /* WebViewController.swift in Sources */,
1654
-				053E126B21F5696E00A64893 /* Toast.swift in Sources */,
1655 1619
 				0500C26521E8644E009A7013 /* NavigationBackDelegate.swift in Sources */,
1656 1620
 				057317A221F5C6A0009B2FCE /* BottomDefaultItem.swift in Sources */,
1657 1621
 				0513106021CA1E53004EF1BE /* UIStoryboardExt.swift in Sources */,
@@ -1684,7 +1648,6 @@
1684 1648
 				05C8D21921ED985C0001E847 /* UINavigationController+NavigationBack.swift in Sources */,
1685 1649
 				05D3A3C821FFF67F00A29A20 /* GestureRecoginzier+NavigationBack.swift in Sources */,
1686 1650
 				05130F5A21C94C12004EF1BE /* PresentDisappearAnimatedTransitioning.swift in Sources */,
1687
-				053E126D21F5767300A64893 /* ToastAnimator.swift in Sources */,
1688 1651
 				053E126721F1719F00A64893 /* PageItem.swift in Sources */,
1689 1652
 				053E127821F5B6E400A64893 /* AlertController.swift in Sources */,
1690 1653
 				05C5285621FE98F50090ECB5 /* GestureRecognizerProxy.swift in Sources */,
@@ -1692,15 +1655,12 @@
1692 1655
 				0513109421CA3915004EF1BE /* QRCodeMaskView.swift in Sources */,
1693 1656
 				0513109721CA3915004EF1BE /* QRCodeScanner.swift in Sources */,
1694 1657
 				05130F5E21C94C12004EF1BE /* PresentAppearAnimatedTransitioning.swift in Sources */,
1695
-				0513107C21CA3907004EF1BE /* FFAlertController.swift in Sources */,
1696 1658
 				05130F5721C94C12004EF1BE /* AlertAnimator.swift in Sources */,
1697 1659
 				0513109321CA3915004EF1BE /* ColorQR.swift in Sources */,
1698 1660
 				0569F61822014B24000A75CA /* NavigationBarDelegate.swift in Sources */,
1699 1661
 				05130F5C21C94C12004EF1BE /* ActionSheetAnimator.swift in Sources */,
1700 1662
 				05130F5B21C94C12004EF1BE /* PresentAnimatable.swift in Sources */,
1701
-				0513107E21CA3907004EF1BE /* FFAlertControllerRepresentable.swift in Sources */,
1702 1663
 				05C8D22B21EF0EDC0001E847 /* NavigationControllerDelegate.swift in Sources */,
1703
-				0521145421F083F20047C55A /* ToastView.swift in Sources */,
1704 1664
 				05C5285821FE995F0090ECB5 /* GestureRecognizerDelegate.swift in Sources */,
1705 1665
 				05130F6321C94C7A004EF1BE /* SideViewController.swift in Sources */,
1706 1666
 				05130F6421C94C7A004EF1BE /* PageViewController.swift in Sources */,
@@ -1711,6 +1671,11 @@
1711 1671
 			isa = PBXSourcesBuildPhase;
1712 1672
 			buildActionMask = 2147483647;
1713 1673
 			files = (
1674
+				058D0CA02249FCF6006CA488 /* Toast.swift in Sources */,
1675
+				058D0CA12249FCF6006CA488 /* ToastView.swift in Sources */,
1676
+				058D0CA22249FCF6006CA488 /* ToastOption.swift in Sources */,
1677
+				058D0CA32249FCF6006CA488 /* ToastAnimator.swift in Sources */,
1678
+				058D0CA42249FCF6006CA488 /* FadeToastAnimator.swift in Sources */,
1714 1679
 				0513106521CA290B004EF1BE /* UserDefaultsExt.swift in Sources */,
1715 1680
 				0513106621CA290B004EF1BE /* StringExt.swift in Sources */,
1716 1681
 				0543E7F421CB911200A42807 /* UserInfoViewModel.swift in Sources */,
@@ -1730,7 +1695,6 @@
1730 1695
 				0535D6DB21D32A9E008D9403 /* GuestUserInfoRemoteAPI.swift in Sources */,
1731 1696
 				05B2C63121D75A1B008063B3 /* ContentResource.swift in Sources */,
1732 1697
 				057CA9CA21DCA70B00FB7D03 /* GroupRepository.swift in Sources */,
1733
-				0513102921CA1B67004EF1BE /* Result.swift in Sources */,
1734 1698
 				05C0D9A421D28591000B7B2A /* UserInfoRemoteAPI.swift in Sources */,
1735 1699
 				0513102B21CA1B67004EF1BE /* HomeRepository.swift in Sources */,
1736 1700
 				0535D6D921D32A89008D9403 /* WXUserInfoRemoteAPI.swift in Sources */,
@@ -1763,7 +1727,7 @@
1763 1727
 				0513103F21CA1B67004EF1BE /* PhotoDetailViewModel.swift in Sources */,
1764 1728
 				054B6C45223F884600939FE6 /* PhotoDetailRemoteAPI.swift in Sources */,
1765 1729
 				0513104021CA1B67004EF1BE /* MessageListViewModel.swift in Sources */,
1766
-				053E127521F5A72000A64893 /* DataError.swift in Sources */,
1730
+				053E127521F5A72000A64893 /* Error.swift in Sources */,
1767 1731
 				05B2C61D21D710C5008063B3 /* GroupRemoteAPI.swift in Sources */,
1768 1732
 				0513104121CA1B67004EF1BE /* MessageViewModel.swift in Sources */,
1769 1733
 				0513104221CA1B67004EF1BE /* CreateGroupViewModel.swift in Sources */,
@@ -1785,7 +1749,6 @@
1785 1749
 			isa = PBXSourcesBuildPhase;
1786 1750
 			buildActionMask = 2147483647;
1787 1751
 			files = (
1788
-				0546D98E2243782300742939 /* ShareView.swift in Sources */,
1789 1752
 				051310B621CB675A004EF1BE /* UIImageView+Kingfisher.swift in Sources */,
1790 1753
 				05130FDD21CA1B04004EF1BE /* GroupViewController.swift in Sources */,
1791 1754
 				05130FDF21CA1B04004EF1BE /* GroupMemberCell.swift in Sources */,
@@ -1811,6 +1774,7 @@
1811 1774
 				05130FF021CA1B04004EF1BE /* MineOrderViewController.swift in Sources */,
1812 1775
 				05130FF121CA1B04004EF1BE /* MineAboutViewController.swift in Sources */,
1813 1776
 				05130FF721CA1B04004EF1BE /* PhotoDetailCommentCell.swift in Sources */,
1777
+				058D0C9D2249C94F006CA488 /* CoordinatorKey.swift in Sources */,
1814 1778
 				0513106B21CA3545004EF1BE /* PhotoDetailCoordinator.swift in Sources */,
1815 1779
 				05130FF821CA1B04004EF1BE /* ImageCell.swift in Sources */,
1816 1780
 				05130FF921CA1B04004EF1BE /* PhotoDetailViewController.swift in Sources */,

BIN
PaiAi/Paiai.xcodeproj/project.xcworkspace/xcuserdata/FFIB.xcuserdatad/UserInterfaceState.xcuserstate


BIN
PaiAi/Paiai/Assets.xcassets/.DS_Store


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-comment.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/Common/icon-comment.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-comment.imageset/icon-评论-2.png → PaiAi/Paiai/Assets.xcassets/Common/icon-comment.imageset/icon-评论-2.png


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-thumbup.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/Common/icon-thumbup.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-thumbup.imageset/icon-赞-2.png → PaiAi/Paiai/Assets.xcassets/Common/icon-thumbup.imageset/icon-赞-2.png


+ 21 - 0
PaiAi/Paiai/Assets.xcassets/Common/logo.imageset/Contents.json

@@ -0,0 +1,21 @@
1
+{
2
+  "images" : [
3
+    {
4
+      "idiom" : "universal",
5
+      "scale" : "1x"
6
+    },
7
+    {
8
+      "idiom" : "universal",
9
+      "scale" : "2x"
10
+    },
11
+    {
12
+      "idiom" : "universal",
13
+      "filename" : "Logo@3x.png",
14
+      "scale" : "3x"
15
+    }
16
+  ],
17
+  "info" : {
18
+    "version" : 1,
19
+    "author" : "xcode"
20
+  }
21
+}

BIN
PaiAi/Paiai/Assets.xcassets/Common/logo.imageset/Logo@3x.png


BIN
PaiAi/Paiai/Assets.xcassets/MainPage/.DS_Store


+ 0 - 21
PaiAi/Paiai/Assets.xcassets/MainPage/FEED_λ_.imageset/Contents.json

@@ -1,21 +0,0 @@
1
-{
2
-  "images" : [
3
-    {
4
-      "idiom" : "universal",
5
-      "scale" : "1x"
6
-    },
7
-    {
8
-      "idiom" : "universal",
9
-      "scale" : "2x"
10
-    },
11
-    {
12
-      "idiom" : "universal",
13
-      "filename" : "FEED_λ_@3x.png",
14
-      "scale" : "3x"
15
-    }
16
-  ],
17
-  "info" : {
18
-    "version" : 1,
19
-    "author" : "xcode"
20
-  }
21
-}

BIN
PaiAi/Paiai/Assets.xcassets/MainPage/FEED_λ_.imageset/FEED_λ_@3x.png


PaiAi/Paiai/Assets.xcassets/MainPage/Contents.json → PaiAi/Paiai/Assets.xcassets/module/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-新增.imageset/BTN-新增.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-add.imageset/BTN-新增.png


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-新增.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-add.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-拍照.imageset/BTN-拍照.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-camera.imageset/BTN-拍照.png


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-拍照.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-camera.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/delete.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-delete.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/delete.imageset/delete.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-delete.imageset/delete.png


PaiAi/Paiai/Assets.xcassets/MainPage/闪光灯-默认70%透明度,按压100%.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-flash.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/闪光灯-默认70%透明度,按压100%.imageset/闪光灯-默认70%透明度,按压100%.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-flash.imageset/闪光灯-默认70%透明度,按压100%.png


PaiAi/Paiai/Assets.xcassets/MainPage/从相册选取-默认70%透明度,按压100%.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-photoAlbum.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/从相册选取-默认70%透明度,按压100%.imageset/从相册选取-默认70%透明度,按压100%.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-photoAlbum.imageset/从相册选取-默认70%透明度,按压100%.png


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-扫码.imageset/BTN-扫码.png → PaiAi/Paiai/Assets.xcassets/module/home/BTN-scanQR.imageset/BTN-扫码.png


PaiAi/Paiai/Assets.xcassets/MainPage/BTN-扫码.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/BTN-scanQR.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/guidePage/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/空白页-无内容.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/home/空白页-无内容.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/空白页-无内容.imageset/空白页-无内容.png → PaiAi/Paiai/Assets.xcassets/module/home/空白页-无内容.imageset/空白页-无内容.png


PaiAi/Paiai/Assets.xcassets/login/微信.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/login/BTN-weixin.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/login/微信.imageset/FE4EEB304DC91AB1789FFFA9B1AA4A03.png → PaiAi/Paiai/Assets.xcassets/module/login/BTN-weixin.imageset/FE4EEB304DC91AB1789FFFA9B1AA4A03.png


PaiAi/Paiai/Assets.xcassets/login/Contents.json → PaiAi/Paiai/Assets.xcassets/module/login/Contents.json


PaiAi/Paiai/Assets.xcassets/guidePage/guide1.imageset/8778FB9773576108C6D5109F23D69C69.png → PaiAi/Paiai/Assets.xcassets/module/login/guide1.imageset/8778FB9773576108C6D5109F23D69C69.png


PaiAi/Paiai/Assets.xcassets/guidePage/guide1.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/login/guide1.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/guidePage/guide2.imageset/A4494A157AB20FA47B8B96993319B3E9.png → PaiAi/Paiai/Assets.xcassets/module/login/guide2.imageset/A4494A157AB20FA47B8B96993319B3E9.png


PaiAi/Paiai/Assets.xcassets/guidePage/guide2.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/login/guide2.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/guidePage/guide3.imageset/862B9012863929D278CBEF1E3A118E6D.png → PaiAi/Paiai/Assets.xcassets/module/login/guide3.imageset/862B9012863929D278CBEF1E3A118E6D.png


PaiAi/Paiai/Assets.xcassets/guidePage/guide3.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/login/guide3.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/message/Contents.json → PaiAi/Paiai/Assets.xcassets/module/message/Contents.json


PaiAi/Paiai/Assets.xcassets/message/message-comment.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/message/message-comment.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/message/message-comment.imageset/消息-评论.png → PaiAi/Paiai/Assets.xcassets/module/message/message-comment.imageset/消息-评论.png


PaiAi/Paiai/Assets.xcassets/message/message-system.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/message/message-system.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/message/message-system.imageset/消息-官方提示.png → PaiAi/Paiai/Assets.xcassets/module/message/message-system.imageset/消息-官方提示.png


PaiAi/Paiai/Assets.xcassets/message/message-thumpub.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/message/message-thumpub.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/message/message-thumpub.imageset/消息-赞.png → PaiAi/Paiai/Assets.xcassets/module/message/message-thumpub.imageset/消息-赞.png


PaiAi/Paiai/Assets.xcassets/MainPage/注销切图.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/BTN-logout.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/注销切图.imageset/注销切图@3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/BTN-logout.imageset/注销切图@3x.png


PaiAi/Paiai/Assets.xcassets/mine/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/about-contactUs.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/about-contactUs.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/about-contactUs.imageset/我的-客服 @3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/about-contactUs.imageset/我的-客服 @3x.png


PaiAi/Paiai/Assets.xcassets/mine/about-score.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/about-score.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/about-score.imageset/关于-用户协议 @3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/about-score.imageset/关于-用户协议 @3x.png


PaiAi/Paiai/Assets.xcassets/mine/about-userAgreement.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/about-userAgreement.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/about-userAgreement.imageset/关于-用户协议 @3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/about-userAgreement.imageset/关于-用户协议 @3x.png


PaiAi/Paiai/Assets.xcassets/mine/mine-about.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/mine-about.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/mine-about.imageset/关于@3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/mine-about.imageset/关于@3x.png


PaiAi/Paiai/Assets.xcassets/mine/mine-feedback.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/mine-feedback.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/mine-feedback.imageset/我的-意见反馈 copy.png → PaiAi/Paiai/Assets.xcassets/module/mine/mine-feedback.imageset/我的-意见反馈 copy.png


PaiAi/Paiai/Assets.xcassets/mine/mine-group.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/mine-group.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/mine-group.imageset/群组@3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/mine-group.imageset/群组@3x.png


PaiAi/Paiai/Assets.xcassets/mine/mine-order.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/mine/mine-order.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/mine/mine-order.imageset/订单@3x.png → PaiAi/Paiai/Assets.xcassets/module/mine/mine-order.imageset/订单@3x.png


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-comment.imageset/BTN-评论.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-comment.imageset/BTN-评论.png


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-comment.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-comment.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-download.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-download.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-download.imageset/大图模式-下载.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-download.imageset/大图模式-下载.png


PaiAi/Paiai/Assets.xcassets/photoDetail/进入群.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-enterGroup.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/进入群.imageset/进入群.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-enterGroup.imageset/进入群.png


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-rotate.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-rotate.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-rotate.imageset/旋转.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-rotate.imageset/旋转.png


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-share.imageset/BTN-分享.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-share.imageset/BTN-分享.png


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-share.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-share.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-thumbup.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-thumbup.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/BTN-thumbup.imageset/Oval 491.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/BTN-thumbup.imageset/Oval 491.png


PaiAi/Paiai/Assets.xcassets/photoDetail/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/购买-去水印.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-purchase-watermark.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/购买-去水印.imageset/购买-去水印.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-purchase-watermark.imageset/购买-去水印.png


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-time.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-time.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/icon-time.imageset/icon-记录.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/icon-time.imageset/icon-记录.png


PaiAi/Paiai/Assets.xcassets/photoDetail/purchase-background.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/purchase-background.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/purchase-background.imageset/获取高清图.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/purchase-background.imageset/获取高清图.png


PaiAi/Paiai/Assets.xcassets/photoDetail/share/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-QQ.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-QQ.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-QQ.imageset/分享-QQ.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-QQ.imageset/分享-QQ.png


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-weibo.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-weibo.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-weibo.imageset/分享-微博.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-weibo.imageset/分享-微博.png


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-wx.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wx.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-wx.imageset/分享-微信好友.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wx.imageset/分享-微信好友.png


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-wxCircle.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wxCircle.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/share/share-wxCircle.imageset/分享-朋友圈.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/share/share-wxCircle.imageset/分享-朋友圈.png


PaiAi/Paiai/Assets.xcassets/photoDetail/去除水印.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/去除水印.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/去除水印.imageset/去除水印.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/去除水印.imageset/去除水印.png


PaiAi/Paiai/Assets.xcassets/MainPage/提示弹窗-勾.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/提示弹窗-勾.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/提示弹窗-勾.imageset/提示弹窗-勾.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/提示弹窗-勾.imageset/提示弹窗-勾.png


PaiAi/Paiai/Assets.xcassets/MainPage/收起.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/收起.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/MainPage/收起.imageset/列表箭头.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/收起.imageset/列表箭头.png


PaiAi/Paiai/Assets.xcassets/photoDetail/购买-HD.imageset/Contents.json → PaiAi/Paiai/Assets.xcassets/module/photoDetail/购买-HD.imageset/Contents.json


PaiAi/Paiai/Assets.xcassets/photoDetail/购买-HD.imageset/购买-HD.png → PaiAi/Paiai/Assets.xcassets/module/photoDetail/购买-HD.imageset/购买-HD.png


BIN
PaiAi/PaiaiDataKit/.DS_Store


+ 1 - 1
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/GroupRemoteAPI.swift

@@ -32,7 +32,7 @@ struct GroupRemoteAPI {
32 32
     
33 33
     func loadContent(page: Int) -> Single<NetworkArrayData<GroupItem>> {
34 34
         let resource = ContentResource<NetworkArrayData<GroupItem>>(path: .groupList,
35
-                                                                    parameter: ["user_id": ShareUserId, "page": page],
35
+                                                                    parameter: ["user_id": ShareUserId, "page": page, "num": 20],
36 36
                                                                     parseJSON: parse)
37 37
         return resource.loadContent()
38 38
     }

+ 1 - 1
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/MessageRemoteAPI.swift

@@ -31,7 +31,7 @@ struct MessageRemoteAPI {
31 31
     
32 32
     func loadMessageList(_ type: MessageType, page: Int) -> Single<NetworkArrayData<MessageListItem>> {
33 33
         let resource = ContentResource<NetworkArrayData<MessageListItem>>(path: type.model.path,
34
-                                                                          parameter: ["user_id": ShareUserId, "page": page],
34
+                                                                          parameter: ["user_id": ShareUserId, "page": page, "num": 20],
35 35
                                                                           parseJSON: parseMessageList)
36 36
         return resource.loadContent()
37 37
     }

+ 2 - 1
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/OrderRemoteAPI.swift

@@ -18,7 +18,8 @@ struct OrderRemoteAPI {
18 18
     
19 19
     func loadContent(page: Int) -> Single<NetworkArrayData<OrderItem>> {
20 20
         let resource = ContentResource<NetworkArrayData<OrderItem>>(path: .orderList,
21
-                                                                    parameter: ["user_id": ShareUserId, "page": page],
21
+                                                                    parameter: ["user_id": ShareUserId,
22
+                                                                                "page": page, "num": 20],
22 23
                                                                     parseJSON: parse)
23 24
         return resource.loadContent()
24 25
     }

+ 4 - 6
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/NetworkApi.swift

@@ -6,14 +6,10 @@
6 6
 //  Copyright © 2017年 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 import Alamofire
11 11
 import RxSwift
12 12
 
13
-struct ParseError: Error {}
14
-
15
-//public typealias Request = Parsable & Resource
16
-
17 13
 class NetworkApi {
18 14
 
19 15
     public static let share = NetworkApi()
@@ -83,13 +79,15 @@ class NetworkApi {
83 79
                         guard let json = json as? [String: AnyObject],
84 80
                             let status = json["status"] as? Int,
85 81
                             let data = resource.parse(json) else {
82
+                                Toast.show(message: "解析失败")
86 83
                                 observer(.error(ParseError()))
87 84
                                 return
88 85
                         }
89 86
                         if status == 200 {
90 87
                             observer(.success(data))
91 88
                         } else {
92
-                            observer(.error(InteractionError(id: status, errMessage: "")))
89
+                            Toast.show(message: (json["description"]  as? String) ?? "")
90
+                            observer(.error(BusinessError(id: status)))
93 91
                         }
94 92
                         
95 93
                     case .failure(let error):

+ 0 - 42
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/NetWork/Result.swift

@@ -1,42 +0,0 @@
1
-//
2
-//  Result.swift
3
-//  PaiAi
4
-//
5
-//  Created by ffib on 2018/12/4.
6
-//  Copyright © 2018 yb. All rights reserved.
7
-//
8
-
9
-import Foundation
10
-
11
-enum Result<A> {
12
-    case error(Error)
13
-    case success(A)
14
-    
15
-    init(_ value: A?, or: @autoclosure () -> Error) {
16
-        if let x = value { self = .success(x) }
17
-        else { self = .error(or()) }
18
-    }
19
-    
20
-    func map<B>(_ f: (A) -> B) -> Result<B> {
21
-        switch self {
22
-        case .error(let e): return .error(e)
23
-        case .success(let x): return .success(f(x))
24
-        }
25
-    }
26
-    
27
-    func flatMap<B>(_ f: (A) -> Result<B>) -> Result<B> {
28
-        switch self {
29
-        case .error(let e): return .error(e)
30
-        case .success(let x): return f(x)
31
-        }
32
-    }
33
-    
34
-    func flatMap<B>(_ f: (A) -> B?, or e: Error) -> Result<B> {
35
-        switch self {
36
-        case .error(let e): return .error(e)
37
-        case .success(let x):
38
-            if let value = f(x) { return .success(value) }
39
-            return .error(e)
40
-        }
41
-    }
42
-}

+ 1 - 7
PaiAi/PaiaiDataKit/DataLayer/Repositories/Remote/Reusable/StatusResource.swift

@@ -25,12 +25,6 @@ struct StatusResource: Resource {
25 25
     }
26 26
     
27 27
     func getStatus() -> Completable {
28
-        return NetworkApi.share.post(resource: self).flatMapCompletable({ (model) -> Completable in
29
-            if model.status == 200 {
30
-                return Completable.empty()
31
-            } else {
32
-                return Completable.error(InteractionError(id: model.status, errMessage: model.description))
33
-            }
34
-        })
28
+        return NetworkApi.share.post(resource: self).asCompletable()
35 29
     }
36 30
 }

+ 10 - 14
PaiAi/PaiaiDataKit/PresentLayer/Message/MessageListViewModel.swift

@@ -28,6 +28,8 @@ public class MessageListViewModel {
28 28
     private var _showMessage = PublishSubject<String>()
29 29
     private var items = BehaviorRelay<[MessageListItem]>(value: [])
30 30
     
31
+    public var messageReaded = BehaviorRelay<Bool>(value: false)
32
+    
31 33
     public weak var delegate: MessageListViewModelDelegate?
32 34
     
33 35
     public var isEmpty: Observable<Bool> {
@@ -55,6 +57,8 @@ public class MessageListViewModel {
55 57
     public init(type: MessageType) {
56 58
         self.repository = MessageRepository()
57 59
         self.type = type
60
+        
61
+        readed()
58 62
     }
59 63
     
60 64
     public func reload() {
@@ -65,7 +69,6 @@ public class MessageListViewModel {
65 69
                 guard let `self` = self else { return }
66 70
                 self._hasMoreData.onNext(model.hasMore)
67 71
                 self._isEmpty.accept(!model.data.isEmpty)
68
-                
69 72
                 self.items.accept(model.data)
70 73
                 }, onDisposed: {[weak self] in
71 74
                     guard let `self` = self else { return }
@@ -96,12 +99,7 @@ public class MessageListViewModel {
96 99
                 _items.remove(at: index)
97 100
                 self.items.accept(_items)
98 101
                 self._showMessage.onNext("删除成功")
99
-            }) { (error) in
100
-                guard let error = error as? InteractionError else {
101
-                    return
102
-                }
103
-                self._showMessage.onNext(error.errMessage)
104
-            }.disposed(by: disposeBag)
102
+            }).disposed(by: disposeBag)
105 103
     }
106 104
     
107 105
     public func removeAll() {
@@ -109,17 +107,15 @@ public class MessageListViewModel {
109 107
             .subscribe(onCompleted: {[weak self] in
110 108
                 guard let `self` = self else { return }
111 109
                 self.items.accept([])
110
+                self._isEmpty.accept(false)
112 111
                 self._showMessage.onNext("删除成功")
113
-            }) { (error) in
114
-                guard let error = error as? InteractionError else {
115
-                    return
116
-                }
117
-                self._showMessage.onNext(error.errMessage)
118
-            }.disposed(by: disposeBag)
112
+            }).disposed(by: disposeBag)
119 113
     }
120 114
     
121 115
     public func readed() {
122
-        
116
+        repository.readed(type).subscribe(onCompleted: {
117
+            self.messageReaded.accept(false)
118
+        }).disposed(by: disposeBag)
123 119
     }
124 120
     
125 121
     public func didSelect(item: MessageListItem) {

+ 1 - 6
PaiAi/PaiaiDataKit/PresentLayer/Mine/MineGroupViewModel.swift

@@ -94,12 +94,7 @@ public class MineGroupViewModel {
94 94
                 _items.remove(at: index)
95 95
                 self.items.accept(_items)
96 96
                 self._showMessage.onNext("删除成功")
97
-            }) { (error) in
98
-                guard let error = error as? InteractionError else {
99
-                    return
100
-                }
101
-                self._showMessage.onNext(error.errMessage)
102
-            }.disposed(by: disposeBag)
97
+            }).disposed(by: disposeBag)
103 98
     }
104 99
     
105 100
     public func didSelect(_ item: GroupItem) {

+ 4 - 3
PaiAi/PaiaiDataKit/Resuable/DataError.swift

@@ -1,5 +1,5 @@
1 1
 //
2
-//  DataError.swift
2
+//  Error.swift
3 3
 //  PaiaiDataKit
4 4
 //
5 5
 //  Created by ffib on 2019/1/21.
@@ -8,7 +8,8 @@
8 8
 
9 9
 import Foundation
10 10
 
11
-public struct InteractionError: Error {
11
+public struct BusinessError: Error {
12 12
     public var id: Int
13
-    public var errMessage: String
14 13
 }
14
+
15
+public struct ParseError: Error {}

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/FadeToastAnimator.swift

@@ -6,7 +6,7 @@
6 6
 //  Copyright © 2019 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 
11 11
 class FadeToastAnimator: ToastAnimator {
12 12
     func toastIn(in view: UIView, completion: ((Bool) -> Void)?) {

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/Toast.swift

@@ -6,7 +6,7 @@
6 6
 //  Copyright © 2019 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 
11 11
 private let globalInstance = Toast()
12 12
 

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/ToastAnimator.swift

@@ -6,7 +6,7 @@
6 6
 //  Copyright © 2019 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 
11 11
 public protocol ToastAnimator {
12 12
     func toastIn(in view: UIView, completion: ((Bool) -> Void)?)

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/ToastOption.swift

@@ -6,7 +6,7 @@
6 6
 //  Copyright © 2019 yb. All rights reserved.
7 7
 //
8 8
 
9
-import Foundation
9
+import UIKit
10 10
 
11 11
 public struct ToastOption {
12 12
     var tintColor: UIColor = UIColor.white

+ 6 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/Toast/ToastView.swift

@@ -8,7 +8,7 @@
8 8
 
9 9
 import UIKit
10 10
 
11
-class ToastView: NiblessView {
11
+class ToastView: UIView {
12 12
     
13 13
     fileprivate var option: ToastOption
14 14
     fileprivate var toastType: Toast.ToastType
@@ -34,6 +34,11 @@ class ToastView: NiblessView {
34 34
         initProperty()
35 35
     }
36 36
     
37
+    @available(*, unavailable, message: "Loading this view from a nib is unsupported")
38
+    public required init?(coder aDecoder: NSCoder) {
39
+        fatalError("Loading this view from a nib is unsupported")
40
+    }
41
+    
37 42
     private func initProperty() {
38 43
         alpha = 0
39 44
         layer.cornerRadius = 5

+ 6 - 0
PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UIImageExt.swift

@@ -40,6 +40,12 @@ public extension UIImage {
40 40
                                                                       resizingMode: .stretch)
41 41
         }
42 42
         
43
+        public static var right: UIImage? {
44
+            return UIImage(named: "navigation-right")?.resizableImage(withCapInsets: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0),
45
+                                                                           resizingMode: .stretch)
46
+        }
47
+        
48
+        
43 49
         public static var verticalPoints: UIImage? {
44 50
             return UIImage(named: "navigation-vertical-points")?.resizableImage(withCapInsets: UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0),
45 51
                                                                            resizingMode: .stretch)

+ 3 - 22
PaiAi/PaiaiUIKit/Reusable/Extension/UIKit/UITextViewExt.swift

@@ -90,9 +90,9 @@ extension UITextView: UITextViewDelegate {
90 90
     /// Resize the placeholder UILabel to make sure it's in the same position as the UITextView text
91 91
     private func resizePlaceholder() {
92 92
         if let placeholderLabel = viewWithTag(1000001) as! UILabel? {
93
-            let labelX = self.textContainer.lineFragmentPadding
94
-            let labelY = self.textContainerInset.top - 2
95
-            let labelWidth = self.frame.width - (labelX * 2)
93
+            let labelX = textContainer.lineFragmentPadding + textContainerInset.left
94
+            let labelY = textContainerInset.top - 2
95
+            let labelWidth = frame.width - (labelX * 2)
96 96
             let labelHeight = placeholderLabel.frame.height
97 97
             
98 98
             placeholderLabel.frame = CGRect(x: labelX, y: labelY, width: labelWidth, height: labelHeight)
@@ -115,25 +115,6 @@ extension UITextView: UITextViewDelegate {
115 115
     }
116 116
 }
117 117
 
118
-
119
-extension UITextView {
120
-    
121
-    private struct AssociatedKeys {
122
-        static var adaptiveHeightKey = "UITextView.adaptiveHeightKey"
123
-    }
124
-    
125
-//    public var isAdaptiveHeight: Bool {
126
-//        get {
127
-//            return associatedObject(key: &AssociatedKeys.adaptiveHeightKey, initialiser: { () -> Bool in
128
-//                return false
129
-//            })
130
-//        }
131
-//        set {
132
-//            associateObject(key: &AssociatedKeys.adaptiveHeightKey, value: newValue)
133
-//        }
134
-//    }
135
-}
136
-
137 118
 // scroll
138 119
 extension UITextView {
139 120
     

+ 0 - 187
PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/FFAlertController.swift

@@ -1,187 +0,0 @@
1
-//
2
-//  FFAlertController.swift
3
-//  FFAlert
4
-//
5
-//  Created by FFIB on 2017/11/13.
6
-//  Copyright © 2017年 FFIB. All rights reserved.
7
-//
8
-
9
-import UIKit
10
-
11
-//public enum FFAlertStyle {
12
-//    case actionSheet
13
-//    case alert
14
-//}
15
-//
16
-//public class FFAlertController: UIViewController {
17
-//
18
-////    private
19
-//    private var transitionDelegate: FFTransitioning
20
-//    private var alert: UIView & FFAlertRepresentable
21
-//
22
-//    public var alertStyle: FFAlertStyle
23
-//    public var contentEdgeInsets: UIEdgeInsets {
24
-//        get { return self.alert.contentEdgInsets }
25
-//        set { alert.contentEdgInsets = newValue }
26
-//    }
27
-//
28
-//    public var attributedTitle: NSAttributedString? {
29
-//        get { return self.alert.title }
30
-//        set { self.alert.title = newValue }
31
-//    }
32
-//
33
-//    public var attributedMessage: NSAttributedString? {
34
-//        get { return self.alert.message }
35
-//        set { self.alert.message = newValue }
36
-//    }
37
-//
38
-//    public override var title: String? {
39
-//        get { return attributedTitle?.string }
40
-//        set { attributedTitle = NSAttributedString(string: newValue ?? "", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: UIColor.init(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0)]) }
41
-//    }
42
-//
43
-//    public var message: String? {
44
-//        get { return attributedMessage?.string }
45
-//        set { attributedMessage = NSAttributedString(string: newValue ?? "", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14), NSAttributedString.Key.foregroundColor: UIColor.init(red: 0.6, green: 0.6, blue: 0.6, alpha: 1.0)]) }
46
-//    }
47
-//
48
-//    private var alertActions: [FFAlertAction] {
49
-//        get { return alert.alertActions }
50
-//        set { alert.alertActions = newValue }
51
-//    }
52
-//
53
-//    public var alertEdgInsets: (left: CGFloat, right: CGFloat) {
54
-//        get { return alert.edgInsets }
55
-//        set { alert.edgInsets = newValue }
56
-//    }
57
-//
58
-//    convenience init(title: String? = nil, message: String? = nil,
59
-//                     customView: UIView,
60
-//                     alertStyle: FFAlertStyle = .alert) {
61
-//        self.init(alertStyle: alertStyle)
62
-//        self.alert.contentView = customView
63
-//        self.title = title
64
-//        self.message = message
65
-//    }
66
-//
67
-//    convenience init(title: String? = nil, message: String? = nil,
68
-//                     alertStyle: FFAlertStyle = .alert) {
69
-//        self.init(alertStyle: alertStyle)
70
-//        self.title = title
71
-//        self.message = message
72
-//
73
-//    }
74
-//
75
-//    convenience init(attributedTitle: NSAttributedString? = nil,
76
-//                     attributedMessage: NSAttributedString? = nil,
77
-//                     alertStyle: FFAlertStyle = .alert) {
78
-//        self.init(alertStyle: alertStyle)
79
-//        self.attributedTitle = attributedTitle
80
-//        self.attributedMessage = attributedMessage
81
-//    }
82
-//
83
-//    private init(alertStyle: FFAlertStyle) {
84
-//        switch alertStyle {
85
-//        case .alert:
86
-//            self.alert = FFAlertView()
87
-//        case .actionSheet:
88
-//            self.alert = FFSheetView()
89
-//        }
90
-//        self.alertStyle = alertStyle
91
-//        self.transitionDelegate = FFTransitioning(alertStyle: alertStyle)
92
-//        super.init(nibName: nil, bundle: nil)
93
-//        commonInit()
94
-//    }
95
-//
96
-//    required public init?(coder aDecoder: NSCoder) {
97
-//        fatalError("init(coder:) has not been implemented")
98
-//    }
99
-//
100
-//    private func commonInit() {
101
-//        self.modalPresentationStyle = .custom
102
-//        self.transitioningDelegate = self.transitionDelegate
103
-//    }
104
-//
105
-//    override public var preferredStatusBarStyle: UIStatusBarStyle {
106
-//        return presentingViewController?.preferredStatusBarStyle ?? .default
107
-//    }
108
-//
109
-//    override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
110
-//        return presentingViewController?.supportedInterfaceOrientations ?? super.supportedInterfaceOrientations
111
-//    }
112
-//
113
-//    override public func viewDidLoad() {
114
-//        super.viewDidLoad()
115
-//        configurationOfAlertView()
116
-//        let tap = UITapGestureRecognizer(target: self, action: #selector(disappear))
117
-//        tap.delegate = self
118
-//        view.addGestureRecognizer(tap)
119
-//    }
120
-//
121
-//    @objc
122
-//    func disappear() {
123
-//        dismiss(animated: true, completion: nil)
124
-//    }
125
-//
126
-//    func configurationOfAlertView() {
127
-//        view.addSubview(alert)
128
-//        alert.translatesAutoresizingMaskIntoConstraints = false
129
-//        alert.backgroundColor = UIColor.white
130
-//        switch alertStyle {
131
-//        case .actionSheet:
132
-//            NSLayoutConstraint.activate(
133
-//                [NSLayoutConstraint(item: alert, attribute: .leading,
134
-//                                    relatedBy: .equal,
135
-//                                    toItem: view, attribute: .leading,
136
-//                                    multiplier: 1, constant: alertEdgInsets.left),
137
-//                 NSLayoutConstraint(item: alert, attribute: .bottom,
138
-//                                    relatedBy: .equal,
139
-//                                    toItem: view, attribute: .bottom,
140
-//                                    multiplier: 1, constant: 0),
141
-//                 NSLayoutConstraint(item: alert, attribute: .trailing,
142
-//                                    relatedBy: .equal,
143
-//                                    toItem: view, attribute: .trailing,
144
-//                                    multiplier: 1, constant: -alertEdgInsets.right),
145
-//                 NSLayoutConstraint(item: alert, attribute: .height,
146
-//                                    relatedBy: .lessThanOrEqual,
147
-//                                    toItem: view, attribute: .height,
148
-//                                    multiplier: 1, constant: 0)]
149
-//            )
150
-//            alert.setContentCompressionResistancePriority(.required, for: .vertical)
151
-//        case .alert:
152
-//            NSLayoutConstraint.activate(
153
-//                [NSLayoutConstraint(item: alert, attribute: .leading,
154
-//                                    relatedBy: .equal,
155
-//                                    toItem: view, attribute: .leading,
156
-//                                    multiplier: 1, constant: alertEdgInsets.left),
157
-//                 NSLayoutConstraint(item: alert, attribute: .centerY,
158
-//                                    relatedBy: .equal,
159
-//                                    toItem: view, attribute: .centerY,
160
-//                                    multiplier: 1, constant: 0),
161
-//                 NSLayoutConstraint(item: alert, attribute: .trailing,
162
-//                                    relatedBy: .equal,
163
-//                                    toItem: view, attribute: .trailing,
164
-//                                    multiplier: 1, constant: -alertEdgInsets.right),
165
-//                 NSLayoutConstraint(item: alert, attribute: .height,
166
-//                                    relatedBy: .lessThanOrEqual,
167
-//                                    toItem: view, attribute: .height,
168
-//                                    multiplier: 1, constant: 0)]
169
-//            )
170
-//            alert.setContentCompressionResistancePriority(.required, for: .vertical)
171
-//        }
172
-//
173
-//    }
174
-//
175
-//    func addAlertAction(alertAction: FFAlertAction) {
176
-//        alertActions.append(alertAction)
177
-//    }
178
-//}
179
-//
180
-//extension FFAlertController: UIGestureRecognizerDelegate {
181
-//    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
182
-//        if alert.frame.contains(touch.location(in: view)) {
183
-//            return false
184
-//        }
185
-//        return true
186
-//    }
187
-//}

+ 0 - 21
PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/Views/FFAlertControllerRepresentable.swift

@@ -1,21 +0,0 @@
1
-//
2
-//  FFAlertControllerRepresentable.swift
3
-//  FFAlert
4
-//
5
-//  Created by FFIB on 2017/11/17.
6
-//  Copyright © 2017年 FFIB. All rights reserved.
7
-//
8
-
9
-import UIKit
10
-
11
-//protocol FFAlertRepresentable {
12
-//    var titleLabel: FFAlertLabel { get set }
13
-//    var messageLabel: FFAlertLabel { get set }
14
-//    var contentView: UIView? { get set }
15
-//    var alertActions: [FFAlertAction] { get set }
16
-//    var contentEdgInsets: UIEdgeInsets { get set }
17
-//    var title: NSAttributedString? { get set }
18
-//    var message: NSAttributedString? { get set }
19
-//    var contentHeight: CGFloat { get set }
20
-//    var edgInsets: (left: CGFloat, right: CGFloat) { get set }
21
-//}

+ 0 - 29
PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/Views/FFAlertLabel.swift

@@ -1,29 +0,0 @@
1
-//
2
-//  FFAlertLabel.swift
3
-//  FFAlert
4
-//
5
-//  Created by FFIB on 2017/11/14.
6
-//  Copyright © 2017年 FFIB. All rights reserved.
7
-//
8
-
9
-import UIKit
10
-
11
-class FFAlertLabel: UILabel {
12
-
13
-    override var attributedText: NSAttributedString? {
14
-        didSet {
15
-            sizeToFit()
16
-        }
17
-    }
18
-
19
-    init() {
20
-        super.init(frame: CGRect.zero)
21
-        self.textAlignment = .center
22
-        self.numberOfLines = 0
23
-        self.translatesAutoresizingMaskIntoConstraints = false
24
-    }
25
-
26
-    required init?(coder aDecoder: NSCoder) {
27
-        super.init(coder: aDecoder)
28
-    }
29
-}

+ 0 - 41
PaiAi/PaiaiUIKit/Reusable/UIKit/Alert/Views/FFSheetActionCell.swift

@@ -1,41 +0,0 @@
1
-//
2
-//  FFSheetActionCell.swift
3
-//  FFAlert
4
-//
5
-//  Created by FFIB on 2017/11/17.
6
-//  Copyright © 2017年 FFIB. All rights reserved.
7
-//
8
-
9
-import UIKit
10
-
11
-//class FFSheetActionCell: UITableViewCell {
12
-//
13
-//    var label = UILabel()
14
-//
15
-//    func setInfo(alertAction: FFAlertAction) {
16
-//        addSubview(label)
17
-//        label.translatesAutoresizingMaskIntoConstraints = false
18
-//        label.attributedText = alertAction.attributedTitle
19
-//        label.backgroundColor = alertAction.backgroundColor
20
-//        label.textAlignment = .center
21
-//        let actionEdgInsets = alertAction.contentEdgInsets ?? UIEdgeInsets.zero
22
-//        NSLayoutConstraint.activate(
23
-//            [NSLayoutConstraint(item: label, attribute: .leading,
24
-//                                relatedBy: .equal,
25
-//                                toItem: self, attribute: .leading,
26
-//                                multiplier: 1, constant: actionEdgInsets.left),
27
-//             NSLayoutConstraint(item: label, attribute: .trailing,
28
-//                                relatedBy: .equal,
29
-//                                toItem: self, attribute: .trailing,
30
-//                                multiplier: 1, constant: -actionEdgInsets.right),
31
-//             NSLayoutConstraint(item: label, attribute: .top,
32
-//                                relatedBy: .equal,
33
-//                                toItem: self, attribute: .top,
34
-//                                multiplier: 1, constant: actionEdgInsets.top),
35
-//             NSLayoutConstraint(item: label, attribute: .bottom,
36
-//                                relatedBy: .equal,
37
-//                                toItem: self, attribute: .bottom,
38
-//                                multiplier: 1, constant: -actionEdgInsets.bottom - 6)]
39
-//        )
40
-//    }
41
-//}

+ 31 - 0
PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/ActionSheetView.swift

@@ -31,6 +31,7 @@ public final class ActionSheetView: UIView {
31 31
         guard viewNotReady else { return }
32 32
         constructViewHierarchy()
33 33
         activateConstraints()
34
+        installTarget()
34 35
         backgroundColor = UIColor(r: 153, g: 153, b: 153)
35 36
         viewNotReady = false
36 37
     }
@@ -58,6 +59,36 @@ public final class ActionSheetView: UIView {
58 59
             _cancelItem = action.style.item
59 60
         }
60 61
     }
62
+    
63
+    private func installTarget() {
64
+        if cancelAction != nil {
65
+            _cancelItem?.addTarget(self, action: #selector(cancelAction(btn:)), for: .touchUpInside)
66
+        }
67
+        
68
+        for (i, item) in _alertItems.enumerated() {
69
+            item.sign = i
70
+            item.addTarget(self, action: #selector(alertAction), for: .touchUpInside)
71
+        }
72
+    }
73
+    
74
+    @objc private func alertAction(btn: UIButton) {
75
+        guard let alertItem = btn as? AlertItem else { return }
76
+        alertActions[alertItem.sign].handler?(alertItem)
77
+        
78
+        dismissSuperViewController()
79
+    }
80
+    
81
+    @objc private func cancelAction(btn: UIButton) {
82
+        guard let cancelItem = _cancelItem else { return }
83
+        cancelAction?.handler?(cancelItem)
84
+        
85
+        dismissSuperViewController()
86
+    }
87
+    
88
+    private func dismissSuperViewController() {
89
+        guard let vc = getSuperViewController() else { return }
90
+        vc.dismissController()
91
+    }
61 92
 }
62 93
 
63 94
 /// MARK:

+ 1 - 0
PaiAi/PaiaiUIKit/Reusable/UIKit/AlertViewController/Default/AlertAction/AlertItem.swift

@@ -9,6 +9,7 @@
9 9
 import UIKit
10 10
 
11 11
 public class AlertItem: UIButton {
12
+    var sign = 0
12 13
     
13 14
     public override init(frame: CGRect) {
14 15
         super.init(frame: frame)

+ 0 - 32
PaiAi/PaiaiUIKit/Reusable/UIKit/FFProgress.swift

@@ -1,32 +0,0 @@
1
-//
2
-//  FFProgress.swift
3
-//  PaiAi
4
-//
5
-//  Created by zhengjianfei on 2017/3/22.
6
-//  Copyright © 2017年 FFIB. All rights reserved.
7
-//
8
-
9
-import UIKit
10
-
11
-class FFProgress: UIView {
12
-    @IBInspectable var lineColor = UIColor.red
13
-    @IBInspectable var lineWidth: CGFloat = 6
14
-    let progressLayer = CAShapeLayer()
15
-    var strokeEnd: CGFloat = 0.0 {
16
-        didSet {
17
-            progressLayer.strokeEnd = strokeEnd
18
-        }
19
-    }
20
-
21
-    override func draw(_ rect: CGRect) {
22
-        let bezierPath = UIBezierPath(arcCenter:CGPoint(x: self.width / 2, y: self.height / 2), radius: self.width / 2, startAngle: .pi / 180.0, endAngle: .pi / -2.0, clockwise: true)
23
-        progressLayer.frame = self.bounds
24
-        progressLayer.fillColor = UIColor.clear.cgColor
25
-        progressLayer.strokeColor = lineColor.cgColor
26
-        progressLayer.lineCap = kCALineCapRound
27
-        progressLayer.lineWidth = lineWidth
28
-        progressLayer.strokeEnd = strokeEnd
29
-        progressLayer.path = bezierPath.cgPath
30
-        self.layer.addSublayer(progressLayer)
31
-    }
32
-}

+ 1 - 1
PaiAi/PaiaiUIKit/Reusable/UIKit/NavigationBack/GestureRecoginzier+NavigationBack.swift

@@ -15,7 +15,7 @@ public extension GestureRecognizerDelegate where Self: UIViewController & Naviga
15 15
             gestureRecognizer.isKind(of: UIPanGestureRecognizer.self),
16 16
             let pan = gestureRecognizer as? UIPanGestureRecognizer {
17 17
             let point = pan.translation(in: self.view)
18
-            if point.x > 0 {
18
+            if point.x > 30 {
19 19
                 return true
20 20
             }
21 21
         }

+ 6 - 0
PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerDelegate.swift

@@ -14,6 +14,8 @@ public protocol GestureRecognizerDelegate: class {
14 14
     
15 15
     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
16 16
                            shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool
17
+    
18
+    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool
17 19
 }
18 20
 
19 21
 public extension GestureRecognizerDelegate {
@@ -26,4 +28,8 @@ public extension GestureRecognizerDelegate {
26 28
                            shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
27 29
         return false
28 30
     }
31
+    
32
+    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
33
+        return true
34
+    }
29 35
 }

+ 5 - 0
PaiAi/PaiaiUIKit/Reusable/UIKitDelegate/GestureRecognizerDelegate/GestureRecognizerProxy.swift

@@ -15,6 +15,11 @@ class GestureRecognizerProxy: NSObject, UIGestureRecognizerDelegate {
15 15
         delegate = target
16 16
     }
17 17
     
18
+    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
19
+        guard let d = delegate else { return false }
20
+        return d.gestureRecognizerShouldBegin(gestureRecognizer)
21
+    }
22
+    
18 23
     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
19 24
         guard let d = delegate else { return false }
20 25
         return d.gestureRecognizer(gestureRecognizer, shouldReceive: touch)

+ 0 - 6
PaiAi/Paiai_iOS/App/AppCoordinator.swift

@@ -17,12 +17,6 @@ protocol Coordinator {}
17 17
 
18 18
 public final class AppCoordinator {
19 19
     
20
-    fileprivate enum CoordinatorKey: String {
21
-        case home = "home"
22
-        case message = "message"
23
-        case mine = "mine"
24
-    }
25
-    
26 20
     var shareUserInfoViewModel = UserInfoViewModel()
27 21
     var containerViewController: ContainerViewController
28 22
     var navigationController: UINavigationController

+ 18 - 0
PaiAi/Paiai_iOS/App/CoordinatorKey.swift

@@ -0,0 +1,18 @@
1
+//
2
+//  CoordinatorKey.swift
3
+//  Paiai_iOS
4
+//
5
+//  Created by ffib on 2019/3/26.
6
+//  Copyright © 2019 yb. All rights reserved.
7
+//
8
+
9
+import Foundation
10
+
11
+enum CoordinatorKey: String {
12
+    case home = "home"
13
+    case message = "message"
14
+    case mine = "mine"
15
+    case group = "group"
16
+    case groupDetail = "groupDetail"
17
+    case photoDetail = "photoDetail"
18
+}

+ 2 - 2
PaiAi/Paiai_iOS/App/Group/Group.storyboard

@@ -30,7 +30,7 @@
30 30
                                     <constraint firstAttribute="height" constant="64" id="dza-Pq-ZRx"/>
31 31
                                     <constraint firstAttribute="width" constant="64" id="kEi-cK-cxH"/>
32 32
                                 </constraints>
33
-                                <state key="normal" image="BTN-拍照"/>
33
+                                <state key="normal" image="BTN-camera"/>
34 34
                                 <state key="selected" image="BTN-拍照-press"/>
35 35
                                 <connections>
36 36
                                     <action selector="takePhotoAction" destination="qPy-31-33I" eventType="touchUpInside" id="vIP-Gk-vDZ"/>
@@ -60,7 +60,7 @@
60 60
         </scene>
61 61
     </scenes>
62 62
     <resources>
63
-        <image name="BTN-拍照" width="168" height="168"/>
63
+        <image name="BTN-camera" width="168" height="168"/>
64 64
         <image name="BTN-拍照-press" width="16" height="16"/>
65 65
     </resources>
66 66
 </document>

+ 3 - 3
PaiAi/Paiai_iOS/App/Group/GroupCoordinator.swift

@@ -14,7 +14,7 @@ class GroupCoordinator: Coordinator {
14 14
     let navigationController: UINavigationController
15 15
     let groupViewController: GroupViewController
16 16
     
17
-    var coordinators: [String: Coordinator] = [:]
17
+    var coordinators: [CoordinatorKey: Coordinator] = [:]
18 18
     
19 19
     init(_ groupVC: GroupViewController, navigationController: UINavigationController) {
20 20
         self.groupViewController = groupVC
@@ -28,7 +28,7 @@ class GroupCoordinator: Coordinator {
28 28
 extension GroupCoordinator: GroupViewModelDelegate {
29 29
     func navigateToGroupDetail(_ item: GroupItem) {
30 30
         let coordinator = GroupDetailCoordinator(makeGroupDetailViewController(item), navigationController: navigationController)
31
-        coordinators["groupDetail"] = coordinator
31
+        coordinators[.groupDetail] = coordinator
32 32
         
33 33
         navigationController.pushViewController(coordinator.groupDetailViewController)
34 34
     }
@@ -40,7 +40,7 @@ extension GroupCoordinator: GroupViewModelDelegate {
40 40
         let coordinator = PhotoDetailCoordinator(ctl, nav: navigationController,
41 41
                                                  viewModel: viewModel,
42 42
                                                  listViewModel: PhotoDetailListViewModel(items: items, currIndex: currIndex))
43
-        coordinators["photoDetail"] = coordinator
43
+        coordinators[.photoDetail] = coordinator
44 44
         coordinator.start()
45 45
         navigationController.pushViewController(coordinator.photoDetailViewController)
46 46
     }

+ 2 - 2
PaiAi/Paiai_iOS/App/Group/GroupDetail/GroupDetail.storyboard

@@ -440,7 +440,7 @@
440 440
                                                         <constraint firstAttribute="width" constant="33" id="Lao-Lp-1av"/>
441 441
                                                         <constraint firstAttribute="height" constant="33" id="wB9-o4-baK"/>
442 442
                                                     </constraints>
443
-                                                    <state key="normal" title="Button" image="delete"/>
443
+                                                    <state key="normal" title="Button" image="BTN-delete"/>
444 444
                                                     <connections>
445 445
                                                         <action selector="deleteMemberAction:" destination="DJ1-Ig-ZYH" eventType="touchUpInside" id="kwS-bB-js1"/>
446 446
                                                     </connections>
@@ -490,7 +490,7 @@
490 490
         </scene>
491 491
     </scenes>
492 492
     <resources>
493
-        <image name="delete" width="66" height="66"/>
493
+        <image name="BTN-delete" width="66" height="66"/>
494 494
         <image name="list-QR" width="36" height="36"/>
495 495
         <image name="list-arrow" width="24" height="36"/>
496 496
         <image name="navigation-background" width="12" height="132"/>

+ 2 - 1
PaiAi/Paiai_iOS/App/Group/GroupViewController.swift

@@ -66,7 +66,8 @@ final class GroupViewController: UIViewController {
66 66
     
67 67
     private func setupReloadControl() {
68 68
         collectionView.addPullToRefresh(PullToRefresh()) {
69
-            [unowned self] in
69
+            [weak self] in
70
+            guard let `self` = self else { return }
70 71
             self.viewModel.reload()
71 72
         }
72 73
         collectionView.startRefreshing(at: .top)

+ 0 - 7
PaiAi/Paiai_iOS/App/Home/HomeCoordinator.swift

@@ -11,13 +11,6 @@ import PaiaiDataKit
11 11
 import PaiaiUIKit
12 12
 
13 13
 class HomeCoordinator: Coordinator {
14
-    fileprivate enum CoordinatorKey: String {
15
-        case home = "home"
16
-        case message = "message"
17
-        case mine = "mine"
18
-        case photoDetail = "photoDetail"
19
-        case group = "group"
20
-    }
21 14
     fileprivate var coordinators = [CoordinatorKey: Coordinator]()
22 15
     
23 16
     var homeViewController: HomeViewController

+ 2 - 1
PaiAi/Paiai_iOS/App/Home/HomeViewController.swift

@@ -53,7 +53,8 @@ final class HomeViewController: UIViewController {
53 53
     
54 54
     private func setupLoadingControl() {
55 55
         collectionView.addPullToRefresh(PullToRefresh(position: .bottom)) {
56
-            [unowned self] in
56
+            [weak self] in
57
+            guard let `self` = self else { return }
57 58
             self.viewModel.preload()
58 59
         }
59 60
     }

+ 10 - 10
PaiAi/Paiai_iOS/App/Home/Main.storyboard

@@ -36,14 +36,14 @@
36 36
                                 <subviews>
37 37
                                     <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="rAd-6a-QN5">
38 38
                                         <rect key="frame" x="212" y="30" width="126" height="126"/>
39
-                                        <state key="normal" image="闪光灯-默认70%透明度,按压100%"/>
39
+                                        <state key="normal" image="BTN-flash"/>
40 40
                                         <connections>
41 41
                                             <action selector="openLight" destination="xAo-Yl-fd5" eventType="touchUpInside" id="S8Z-U4-bVm"/>
42 42
                                         </connections>
43 43
                                     </button>
44 44
                                     <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WMh-c4-xbf">
45 45
                                         <rect key="frame" x="37" y="30" width="126" height="126"/>
46
-                                        <state key="normal" image="从相册选取-默认70%透明度,按压100%"/>
46
+                                        <state key="normal" image="BTN-photoAlbum"/>
47 47
                                         <connections>
48 48
                                             <action selector="chooseFromSYSPhoto" destination="xAo-Yl-fd5" eventType="touchUpInside" id="U7Z-Vq-2r2"/>
49 49
                                         </connections>
@@ -119,7 +119,7 @@
119 119
                                     <constraint firstAttribute="width" constant="64" id="6uz-fL-QnX"/>
120 120
                                     <constraint firstAttribute="height" constant="64" id="fVK-Un-AnR"/>
121 121
                                 </constraints>
122
-                                <state key="normal" image="BTN-扫码"/>
122
+                                <state key="normal" image="BTN-scanQR"/>
123 123
                                 <state key="selected" image="BTN-扫码-press"/>
124 124
                             </button>
125 125
                             <button contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="EqW-Tv-dAo">
@@ -128,7 +128,7 @@
128 128
                                     <constraint firstAttribute="height" constant="64" id="6oe-ry-LNq"/>
129 129
                                     <constraint firstAttribute="width" constant="64" id="bCz-yX-g9j"/>
130 130
                                 </constraints>
131
-                                <state key="normal" image="BTN-新增"/>
131
+                                <state key="normal" image="BTN-add"/>
132 132
                                 <state key="selected" image="BTN-新增-press"/>
133 133
                             </button>
134 134
                         </subviews>
@@ -437,7 +437,7 @@
437 437
                                 <rect key="frame" x="94" y="548.5" width="187.5" height="53.5"/>
438 438
                                 <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
439 439
                                 <inset key="imageEdgeInsets" minX="-10" minY="0.0" maxX="0.0" maxY="0.0"/>
440
-                                <state key="normal" image="微信">
440
+                                <state key="normal" image="BTN-weixin">
441 441
                                     <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
442 442
                                 </state>
443 443
                                 <userDefinedRuntimeAttributes>
@@ -480,16 +480,16 @@
480 480
         </scene>
481 481
     </scenes>
482 482
     <resources>
483
-        <image name="BTN-扫码" width="168" height="168"/>
483
+        <image name="BTN-add" width="168" height="168"/>
484
+        <image name="BTN-flash" width="126" height="126"/>
485
+        <image name="BTN-photoAlbum" width="126" height="126"/>
486
+        <image name="BTN-scanQR" width="168" height="168"/>
487
+        <image name="BTN-weixin" width="911" height="247"/>
484 488
         <image name="BTN-扫码-press" width="168" height="168"/>
485
-        <image name="BTN-新增" width="168" height="168"/>
486 489
         <image name="BTN-新增-press" width="168" height="168"/>
487 490
         <image name="guide1" width="1462" height="2600"/>
488 491
         <image name="guide2" width="1462" height="2600"/>
489 492
         <image name="guide3" width="1462" height="2600"/>
490
-        <image name="从相册选取-默认70%透明度,按压100%" width="126" height="126"/>
491
-        <image name="微信" width="911" height="247"/>
492
-        <image name="闪光灯-默认70%透明度,按压100%" width="126" height="126"/>
493 493
         <image name="默认头像" width="240" height="240"/>
494 494
     </resources>
495 495
 </document>

+ 11 - 7
PaiAi/Paiai_iOS/App/Message/Message.storyboard

@@ -1,6 +1,10 @@
1 1
 <?xml version="1.0" encoding="UTF-8"?>
2 2
 <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useSafeAreas="YES" colorMatched="YES">
3
+    <device id="retina4_7" orientation="portrait">
4
+        <adaptation id="fullscreen"/>
5
+    </device>
3 6
     <dependencies>
7
+        <deployment identifier="iOS"/>
4 8
         <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
5 9
         <capability name="Safe area layout guides" minToolsVersion="9.0"/>
6 10
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -210,7 +214,7 @@
210 214
                                         <nil key="highlightedColor"/>
211 215
                                     </label>
212 216
                                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="mre-Tt-F0S">
213
-                                        <rect key="frame" x="349" y="24" width="16" height="16"/>
217
+                                        <rect key="frame" x="341" y="14" width="24" height="36"/>
214 218
                                     </imageView>
215 219
                                     <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="T9q-a4-Ugc">
216 220
                                         <rect key="frame" x="0.0" y="64" width="375" height="64"/>
@@ -227,7 +231,7 @@
227 231
                                         </constraints>
228 232
                                     </imageView>
229 233
                                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="8VZ-dR-b6z">
230
-                                        <rect key="frame" x="349" y="88" width="16" height="16"/>
234
+                                        <rect key="frame" x="341" y="78" width="24" height="36"/>
231 235
                                     </imageView>
232 236
                                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="赞" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="J3p-B7-gMi">
233 237
                                         <rect key="frame" x="70" y="86" width="17" height="20"/>
@@ -250,7 +254,7 @@
250 254
                                         </constraints>
251 255
                                     </imageView>
252 256
                                     <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="hJe-J2-RpF">
253
-                                        <rect key="frame" x="349" y="152" width="16" height="16"/>
257
+                                        <rect key="frame" x="341" y="142" width="24" height="36"/>
254 258
                                     </imageView>
255 259
                                     <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="评论" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="6fy-0a-WYd">
256 260
                                         <rect key="frame" x="70" y="150" width="33" height="20"/>
@@ -259,7 +263,7 @@
259 263
                                         <nil key="highlightedColor"/>
260 264
                                     </label>
261 265
                                     <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="oLf-Xb-QSv">
262
-                                        <rect key="frame" x="333" y="28" width="8" height="8"/>
266
+                                        <rect key="frame" x="325" y="28" width="8" height="8"/>
263 267
                                         <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
264 268
                                         <constraints>
265 269
                                             <constraint firstAttribute="height" constant="8" id="8PB-CF-AvI"/>
@@ -272,7 +276,7 @@
272 276
                                         </userDefinedRuntimeAttributes>
273 277
                                     </view>
274 278
                                     <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="R8U-gK-x5D">
275
-                                        <rect key="frame" x="333" y="92" width="8" height="8"/>
279
+                                        <rect key="frame" x="325" y="92" width="8" height="8"/>
276 280
                                         <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
277 281
                                         <constraints>
278 282
                                             <constraint firstAttribute="height" constant="8" id="pvk-DY-af3"/>
@@ -285,7 +289,7 @@
285 289
                                         </userDefinedRuntimeAttributes>
286 290
                                     </view>
287 291
                                     <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Qi9-c7-GCt">
288
-                                        <rect key="frame" x="333" y="156" width="8" height="8"/>
292
+                                        <rect key="frame" x="325" y="156" width="8" height="8"/>
289 293
                                         <color key="backgroundColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
290 294
                                         <constraints>
291 295
                                             <constraint firstAttribute="height" constant="8" id="d1V-XC-UJk"/>
@@ -386,7 +390,7 @@
386 390
         </scene>
387 391
     </scenes>
388 392
     <resources>
389
-        <image name="list-arrow" width="16" height="16"/>
393
+        <image name="list-arrow" width="24" height="36"/>
390 394
         <image name="message-comment" width="144" height="144"/>
391 395
         <image name="message-system" width="144" height="144"/>
392 396
         <image name="message-thumpub" width="144" height="144"/>

+ 20 - 16
PaiAi/Paiai_iOS/App/Message/MessageListViewController.swift

@@ -23,7 +23,7 @@ final class MessageListViewController: UIViewController {
23 23
     @IBOutlet weak var tableView: UITableView!
24 24
     
25 25
     var emptyView : UILabel = {
26
-        let empty = UILabel(frame: CGRect(x: kScreenWidth / 2 - 50, y: 74, width: 50, height: 50))
26
+        let empty = UILabel(frame: CGRect(x: kScreenWidth / 2 - 50, y: 5, width: 50, height: 50))
27 27
         
28 28
         empty.isHidden = true
29 29
         empty.text = "当前没有任何消息"
@@ -48,11 +48,12 @@ final class MessageListViewController: UIViewController {
48 48
         setup()
49 49
         binding()
50 50
         setNavigationBar()
51
+        self.viewModel.reload()
51 52
     }
52 53
     
53 54
     private func setNavigationBar() {
54 55
         title = type.model.title
55
-        setRightBarButtonItem(image: UIImage.Navigation.verticalPoints, action: #selector(clearMessage))
56
+        setRightBarButtonItem(image: UIImage.Navigation.right, action: #selector(clearMessage))
56 57
     }
57 58
 
58 59
     private func setup() {
@@ -62,7 +63,8 @@ final class MessageListViewController: UIViewController {
62 63
     
63 64
     private func setupReloadControl() {
64 65
         tableView.addPullToRefresh(PullToRefresh()) {
65
-            [unowned self] in
66
+            [weak self] in
67
+            guard let `self` = self else { return }
66 68
             self.viewModel.reload()
67 69
         }
68 70
         tableView.startRefreshing(at: .top)
@@ -70,7 +72,8 @@ final class MessageListViewController: UIViewController {
70 72
     
71 73
     private func setupLoadingControl() {
72 74
         tableView.addPullToRefresh(PullToRefresh(position: .bottom)) {
73
-            [unowned self] in
75
+            [weak self] in
76
+            guard let `self` = self else { return }
74 77
             self.viewModel.preload()
75 78
         }
76 79
     }
@@ -80,7 +83,7 @@ final class MessageListViewController: UIViewController {
80 83
         let alert = ActionSheetController()
81 84
         
82 85
         alert.addAlertAction(AlertAction(title: "取消", style: .cancel))
83
-        alert.addAlertAction(AlertAction(title: "清空消息", handler: { (item) in
86
+        alert.addAlertAction(AlertAction(title: "清空消息", handler: { _ in
84 87
             self.viewModel.removeAll()
85 88
         }))
86 89
         presentController(alert)
@@ -101,17 +104,18 @@ fileprivate extension MessageListViewController {
101 104
 fileprivate extension MessageListViewController {
102 105
     
103 106
     var dataSource: RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>> {
104
-        return RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>>(configureCell: { (dataSource, tableView, indexPath, item) in
105
-            switch self.type! {
106
-            case .system:
107
-                let cell = tableView.dequeueReusableCell(withIdentifier: "messageSystemCell", for: indexPath) as! MessageSystemCell
108
-                cell.setInfo(item)
109
-                return cell
110
-            case .comment, .thumbup:
111
-                let cell = tableView.dequeueReusableCell(withIdentifier: "messageCommentAndThumbupCell", for: indexPath) as! MessageCommentAndThumbupCell
112
-                cell.setInfo(item)
113
-                return cell
114
-            }
107
+        return RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, MessageListItem>>(
108
+            configureCell: { (dataSource, tableView, indexPath, item) in
109
+                switch self.type! {
110
+                case .system:
111
+                    let cell = tableView.dequeueReusableCell(withIdentifier: "messageSystemCell", for: indexPath) as! MessageSystemCell
112
+                    cell.setInfo(item)
113
+                    return cell
114
+                case .comment, .thumbup:
115
+                    let cell = tableView.dequeueReusableCell(withIdentifier: "messageCommentAndThumbupCell", for: indexPath) as! MessageCommentAndThumbupCell
116
+                    cell.setInfo(item)
117
+                    return cell
118
+                }
115 119
         }, canEditRowAtIndexPath: { _, _ in true })
116 120
     }
117 121
     

+ 95 - 121
PaiAi/Paiai_iOS/App/Mine/Mine.storyboard

@@ -108,7 +108,7 @@
108 108
                 </viewController>
109 109
                 <placeholder placeholderIdentifier="IBFirstResponder" id="ITq-MN-EQz" userLabel="First Responder" sceneMemberID="firstResponder"/>
110 110
             </objects>
111
-            <point key="canvasLocation" x="814.39999999999998" y="322.93853073463271"/>
111
+            <point key="canvasLocation" x="983" y="-164"/>
112 112
         </scene>
113 113
         <!--Mine Feedback View Controller-->
114 114
         <scene sceneID="jVz-lZ-rOH">
@@ -118,48 +118,40 @@
118 118
                         <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
119 119
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
120 120
                         <subviews>
121
-                            <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="iOy-y4-gly">
122
-                                <rect key="frame" x="7" y="20" width="368" height="140"/>
123
-                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
124
-                                <constraints>
125
-                                    <constraint firstAttribute="height" constant="140" id="rmr-7m-qu4"/>
126
-                                </constraints>
127
-                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
128
-                                <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
129
-                            </textView>
130
-                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kyg-hG-JSP">
131
-                                <rect key="frame" x="0.0" y="190" width="375" height="45"/>
132
-                                <constraints>
133
-                                    <constraint firstAttribute="height" constant="45" id="x3X-y4-kmZ"/>
134
-                                </constraints>
135
-                                <fontDescription key="fontDescription" type="system" pointSize="20"/>
136
-                                <state key="normal" title="发送" backgroundImage="BTN-send">
137
-                                    <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
138
-                                </state>
139
-                                <connections>
140
-                                    <action selector="sendFeedBack" destination="iwu-HG-AWF" eventType="touchUpInside" id="hQt-ku-2nH"/>
141
-                                </connections>
142
-                            </button>
143
-                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="r6q-Tb-uYK">
144
-                                <rect key="frame" x="0.0" y="20" width="7" height="140"/>
145
-                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
146
-                                <constraints>
147
-                                    <constraint firstAttribute="width" constant="7" id="mcu-tc-3Gz"/>
148
-                                </constraints>
149
-                            </view>
121
+                            <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="12" translatesAutoresizingMaskIntoConstraints="NO" id="hN3-J9-En6">
122
+                                <rect key="frame" x="0.0" y="20" width="375" height="197"/>
123
+                                <subviews>
124
+                                    <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="iOy-y4-gly">
125
+                                        <rect key="frame" x="0.0" y="0.0" width="375" height="140"/>
126
+                                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
127
+                                        <constraints>
128
+                                            <constraint firstAttribute="height" constant="140" id="rmr-7m-qu4"/>
129
+                                        </constraints>
130
+                                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
131
+                                        <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
132
+                                    </textView>
133
+                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kyg-hG-JSP">
134
+                                        <rect key="frame" x="0.0" y="152" width="375" height="45"/>
135
+                                        <constraints>
136
+                                            <constraint firstAttribute="height" constant="45" id="x3X-y4-kmZ"/>
137
+                                        </constraints>
138
+                                        <fontDescription key="fontDescription" type="system" pointSize="20"/>
139
+                                        <state key="normal" title="发送" backgroundImage="BTN-send">
140
+                                            <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
141
+                                        </state>
142
+                                        <connections>
143
+                                            <action selector="sendFeedBack" destination="iwu-HG-AWF" eventType="touchUpInside" id="hQt-ku-2nH"/>
144
+                                        </connections>
145
+                                    </button>
146
+                                </subviews>
147
+                            </stackView>
150 148
                         </subviews>
151 149
                         <color key="backgroundColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
152 150
                         <gestureRecognizers/>
153 151
                         <constraints>
154
-                            <constraint firstItem="r6q-Tb-uYK" firstAttribute="leading" secondItem="iOy-y4-gly" secondAttribute="leading" constant="-7" id="5tW-Mf-S7u"/>
155
-                            <constraint firstItem="iOy-y4-gly" firstAttribute="leading" secondItem="zyN-cU-iak" secondAttribute="leading" constant="7" id="7a3-jq-iQ0"/>
156
-                            <constraint firstItem="iOy-y4-gly" firstAttribute="top" secondItem="zyN-cU-iak" secondAttribute="top" id="NR4-e2-k5p"/>
157
-                            <constraint firstItem="r6q-Tb-uYK" firstAttribute="bottom" secondItem="iOy-y4-gly" secondAttribute="bottom" id="VLj-GB-is8"/>
158
-                            <constraint firstItem="kyg-hG-JSP" firstAttribute="top" secondItem="iOy-y4-gly" secondAttribute="bottom" constant="30" id="W7x-rO-3tW"/>
159
-                            <constraint firstItem="zyN-cU-iak" firstAttribute="trailing" secondItem="iOy-y4-gly" secondAttribute="trailing" id="dHo-cB-cng"/>
160
-                            <constraint firstItem="kyg-hG-JSP" firstAttribute="leading" secondItem="zyN-cU-iak" secondAttribute="leading" id="eNW-4w-6p7"/>
161
-                            <constraint firstItem="r6q-Tb-uYK" firstAttribute="top" secondItem="iOy-y4-gly" secondAttribute="top" id="mcS-Zb-P9m"/>
162
-                            <constraint firstItem="zyN-cU-iak" firstAttribute="trailing" secondItem="kyg-hG-JSP" secondAttribute="trailing" id="uH1-y3-dPp"/>
152
+                            <constraint firstItem="hN3-J9-En6" firstAttribute="leading" secondItem="zyN-cU-iak" secondAttribute="leading" id="grT-5w-3hd"/>
153
+                            <constraint firstAttribute="trailing" secondItem="hN3-J9-En6" secondAttribute="trailing" id="tlo-OB-46x"/>
154
+                            <constraint firstItem="hN3-J9-En6" firstAttribute="top" secondItem="zyN-cU-iak" secondAttribute="top" id="vyF-KA-cQ3"/>
163 155
                         </constraints>
164 156
                         <viewLayoutGuide key="safeArea" id="zyN-cU-iak"/>
165 157
                         <connections>
@@ -179,7 +171,7 @@
179 171
                     </connections>
180 172
                 </tapGestureRecognizer>
181 173
             </objects>
182
-            <point key="canvasLocation" x="814.39999999999998" y="994.9025487256373"/>
174
+            <point key="canvasLocation" x="292" y="-164"/>
183 175
         </scene>
184 176
         <!--Mine About View Controller-->
185 177
         <scene sceneID="dR7-2C-QzB">
@@ -189,42 +181,42 @@
189 181
                         <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
190 182
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
191 183
                         <subviews>
192
-                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Str-BX-Lky" userLabel="View-up">
193
-                                <rect key="frame" x="0.0" y="20" width="375" height="216"/>
184
+                            <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" translatesAutoresizingMaskIntoConstraints="NO" id="2I3-Nh-YZ5">
185
+                                <rect key="frame" x="0.0" y="20" width="375" height="641"/>
194 186
                                 <subviews>
195
-                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Logo" translatesAutoresizingMaskIntoConstraints="NO" id="B7y-Jl-E7G">
196
-                                        <rect key="frame" x="117.5" y="38" width="140" height="140"/>
187
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Str-BX-Lky" userLabel="Logo view">
188
+                                        <rect key="frame" x="0.0" y="0.0" width="375" height="216"/>
189
+                                        <subviews>
190
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="logo" translatesAutoresizingMaskIntoConstraints="NO" id="B7y-Jl-E7G">
191
+                                                <rect key="frame" x="117.5" y="38" width="140" height="140"/>
192
+                                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
193
+                                            </imageView>
194
+                                        </subviews>
197 195
                                         <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
198
-                                    </imageView>
199
-                                </subviews>
200
-                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
201
-                                <constraints>
202
-                                    <constraint firstItem="B7y-Jl-E7G" firstAttribute="centerX" secondItem="Str-BX-Lky" secondAttribute="centerX" id="5Hv-0h-6dw"/>
203
-                                    <constraint firstItem="B7y-Jl-E7G" firstAttribute="centerY" secondItem="Str-BX-Lky" secondAttribute="centerY" id="ffl-F6-a1m"/>
204
-                                    <constraint firstAttribute="height" constant="216" id="qV0-pB-Hya"/>
205
-                                </constraints>
206
-                            </view>
207
-                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bjC-jQ-LOw" userLabel="View-down">
208
-                                <rect key="frame" x="-4" y="236" width="383" height="431"/>
209
-                                <subviews>
196
+                                        <constraints>
197
+                                            <constraint firstItem="B7y-Jl-E7G" firstAttribute="centerX" secondItem="Str-BX-Lky" secondAttribute="centerX" id="5Hv-0h-6dw"/>
198
+                                            <constraint firstItem="B7y-Jl-E7G" firstAttribute="centerY" secondItem="Str-BX-Lky" secondAttribute="centerY" id="ffl-F6-a1m"/>
199
+                                            <constraint firstAttribute="height" constant="216" id="qV0-pB-Hya"/>
200
+                                        </constraints>
201
+                                    </view>
210 202
                                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="mae-VW-ed0" userLabel="Contact Us View">
211
-                                        <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>
203
+                                        <rect key="frame" x="0.0" y="216" width="375" height="48"/>
212 204
                                         <subviews>
213 205
                                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="about-contactUs" translatesAutoresizingMaskIntoConstraints="NO" id="pVB-Uy-xXH">
214 206
                                                 <rect key="frame" x="16" y="8" width="32" height="32"/>
215 207
                                             </imageView>
216 208
                                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="联系我们" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CYk-cu-pHl">
217
-                                                <rect key="frame" x="62" y="14" width="66" height="20"/>
209
+                                                <rect key="frame" x="62" y="14.5" width="65.5" height="19.5"/>
218 210
                                                 <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
219 211
                                                 <fontDescription key="fontDescription" type="system" pointSize="16"/>
220 212
                                                 <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
221 213
                                                 <nil key="highlightedColor"/>
222 214
                                             </label>
223 215
                                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="MgR-ta-3jg">
224
-                                                <rect key="frame" x="349" y="6" width="24" height="36"/>
216
+                                                <rect key="frame" x="341" y="6" width="24" height="36"/>
225 217
                                             </imageView>
226 218
                                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="L1g-sb-a5F">
227
-                                                <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>
219
+                                                <rect key="frame" x="0.0" y="0.0" width="375" height="48"/>
228 220
                                             </button>
229 221
                                         </subviews>
230 222
                                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -243,23 +235,23 @@
243 235
                                         </constraints>
244 236
                                     </view>
245 237
                                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="EVY-h5-0pO" userLabel="Score View">
246
-                                        <rect key="frame" x="0.0" y="48" width="383" height="48"/>
238
+                                        <rect key="frame" x="0.0" y="264" width="375" height="48"/>
247 239
                                         <subviews>
248 240
                                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="about-score" translatesAutoresizingMaskIntoConstraints="NO" id="0O4-xB-jPJ">
249 241
                                                 <rect key="frame" x="16" y="8" width="32" height="32"/>
250 242
                                             </imageView>
251 243
                                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="给我评分" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JAf-2j-KJO">
252
-                                                <rect key="frame" x="62" y="14" width="66" height="20"/>
244
+                                                <rect key="frame" x="62" y="14.5" width="65.5" height="19.5"/>
253 245
                                                 <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
254 246
                                                 <fontDescription key="fontDescription" type="system" pointSize="16"/>
255 247
                                                 <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
256 248
                                                 <nil key="highlightedColor"/>
257 249
                                             </label>
258 250
                                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="vLw-Zd-Mis">
259
-                                                <rect key="frame" x="349" y="6" width="24" height="36"/>
251
+                                                <rect key="frame" x="341" y="6" width="24" height="36"/>
260 252
                                             </imageView>
261 253
                                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="FIE-jb-ZGu">
262
-                                                <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>
254
+                                                <rect key="frame" x="0.0" y="0.0" width="375" height="48"/>
263 255
                                             </button>
264 256
                                         </subviews>
265 257
                                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -278,23 +270,23 @@
278 270
                                         </constraints>
279 271
                                     </view>
280 272
                                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="hN9-6g-QCB" userLabel="User Agreement View">
281
-                                        <rect key="frame" x="0.0" y="96" width="383" height="48"/>
273
+                                        <rect key="frame" x="0.0" y="312" width="375" height="48"/>
282 274
                                         <subviews>
283 275
                                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="about-userAgreement" translatesAutoresizingMaskIntoConstraints="NO" id="u6G-8X-fqc">
284 276
                                                 <rect key="frame" x="16" y="8" width="32" height="32"/>
285 277
                                             </imageView>
286 278
                                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="用户协议" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="COm-64-2lk">
287
-                                                <rect key="frame" x="62" y="14" width="66" height="20"/>
279
+                                                <rect key="frame" x="62" y="14.5" width="65.5" height="19.5"/>
288 280
                                                 <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
289 281
                                                 <fontDescription key="fontDescription" type="system" pointSize="16"/>
290 282
                                                 <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
291 283
                                                 <nil key="highlightedColor"/>
292 284
                                             </label>
293 285
                                             <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list-arrow" translatesAutoresizingMaskIntoConstraints="NO" id="mhJ-Uj-tdj">
294
-                                                <rect key="frame" x="349" y="6" width="24" height="36"/>
286
+                                                <rect key="frame" x="341" y="6" width="24" height="36"/>
295 287
                                             </imageView>
296 288
                                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="VGv-oO-leT">
297
-                                                <rect key="frame" x="0.0" y="0.0" width="383" height="48"/>
289
+                                                <rect key="frame" x="0.0" y="0.0" width="375" height="48"/>
298 290
                                             </button>
299 291
                                         </subviews>
300 292
                                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
@@ -312,49 +304,33 @@
312 304
                                             <constraint firstItem="mhJ-Uj-tdj" firstAttribute="centerY" secondItem="hN9-6g-QCB" secondAttribute="centerY" id="z8z-9u-ZAm"/>
313 305
                                         </constraints>
314 306
                                     </view>
307
+                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="bjC-jQ-LOw" userLabel="Fill view">
308
+                                        <rect key="frame" x="0.0" y="360" width="375" height="254.5"/>
309
+                                        <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
310
+                                    </view>
311
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="版本:1.0" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bEV-QT-Egq">
312
+                                        <rect key="frame" x="0.0" y="614.5" width="375" height="14.5"/>
313
+                                        <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
314
+                                        <fontDescription key="fontDescription" type="system" pointSize="12"/>
315
+                                        <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
316
+                                        <nil key="highlightedColor"/>
317
+                                    </label>
318
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Copyright@pai.ai" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="inH-WZ-fdD">
319
+                                        <rect key="frame" x="0.0" y="629" width="375" height="12"/>
320
+                                        <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
321
+                                        <fontDescription key="fontDescription" type="system" pointSize="10"/>
322
+                                        <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
323
+                                        <nil key="highlightedColor"/>
324
+                                    </label>
315 325
                                 </subviews>
316
-                                <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
317
-                                <constraints>
318
-                                    <constraint firstItem="mae-VW-ed0" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="25m-1u-PlX"/>
319
-                                    <constraint firstAttribute="trailing" secondItem="EVY-h5-0pO" secondAttribute="trailing" id="Cl6-If-4fD"/>
320
-                                    <constraint firstItem="EVY-h5-0pO" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="Cmx-5f-fSM"/>
321
-                                    <constraint firstItem="EVY-h5-0pO" firstAttribute="top" secondItem="mae-VW-ed0" secondAttribute="bottom" id="Kg3-vC-Ohr"/>
322
-                                    <constraint firstAttribute="trailing" secondItem="mae-VW-ed0" secondAttribute="trailing" id="Qtq-6O-uU3"/>
323
-                                    <constraint firstItem="hN9-6g-QCB" firstAttribute="top" secondItem="EVY-h5-0pO" secondAttribute="bottom" id="SCp-cp-eDW"/>
324
-                                    <constraint firstItem="hN9-6g-QCB" firstAttribute="leading" secondItem="bjC-jQ-LOw" secondAttribute="leading" id="Ufj-Mi-XEY"/>
325
-                                    <constraint firstAttribute="trailing" secondItem="hN9-6g-QCB" secondAttribute="trailing" id="YLN-9T-LED"/>
326
-                                    <constraint firstItem="mae-VW-ed0" firstAttribute="top" secondItem="bjC-jQ-LOw" secondAttribute="top" id="qXw-XK-Fq0"/>
327
-                                </constraints>
328
-                            </view>
329
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Copyright@pai.ai" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="inH-WZ-fdD">
330
-                                <rect key="frame" x="146.5" y="649" width="82" height="12"/>
331
-                                <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
332
-                                <fontDescription key="fontDescription" type="system" pointSize="10"/>
333
-                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
334
-                                <nil key="highlightedColor"/>
335
-                            </label>
336
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="版本:1.0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bEV-QT-Egq">
337
-                                <rect key="frame" x="161" y="628.5" width="53" height="14.5"/>
338
-                                <color key="backgroundColor" red="0.94117647059999998" green="0.94117647059999998" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
339
-                                <fontDescription key="fontDescription" type="system" pointSize="12"/>
340
-                                <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
341
-                                <nil key="highlightedColor"/>
342
-                            </label>
326
+                            </stackView>
343 327
                         </subviews>
344 328
                         <color key="backgroundColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
345 329
                         <constraints>
346
-                            <constraint firstItem="bjC-jQ-LOw" firstAttribute="leading" secondItem="gzV-sh-iNN" secondAttribute="leadingMargin" constant="-20" id="4XL-Mn-Bda"/>
347
-                            <constraint firstAttribute="bottom" secondItem="bjC-jQ-LOw" secondAttribute="bottom" id="7cS-3o-xis"/>
348
-                            <constraint firstItem="bjC-jQ-LOw" firstAttribute="centerX" secondItem="szY-tb-XAT" secondAttribute="centerX" id="B1z-7x-Vdk"/>
349
-                            <constraint firstItem="inH-WZ-fdD" firstAttribute="centerX" secondItem="gzV-sh-iNN" secondAttribute="centerX" id="BGs-5i-uoA"/>
350
-                            <constraint firstItem="bEV-QT-Egq" firstAttribute="centerX" secondItem="gzV-sh-iNN" secondAttribute="centerX" id="CGs-tu-a6G"/>
351
-                            <constraint firstItem="szY-tb-XAT" firstAttribute="bottom" secondItem="inH-WZ-fdD" secondAttribute="bottom" constant="6" id="XIG-RN-kfd"/>
352
-                            <constraint firstItem="bjC-jQ-LOw" firstAttribute="top" secondItem="Str-BX-Lky" secondAttribute="bottom" id="dKZ-iN-vPM"/>
353
-                            <constraint firstItem="szY-tb-XAT" firstAttribute="trailing" secondItem="Str-BX-Lky" secondAttribute="trailing" id="fpg-jU-lLU"/>
354
-                            <constraint firstItem="inH-WZ-fdD" firstAttribute="top" secondItem="bEV-QT-Egq" secondAttribute="bottom" constant="6" id="gQZ-xs-1i5"/>
355
-                            <constraint firstItem="Str-BX-Lky" firstAttribute="top" secondItem="szY-tb-XAT" secondAttribute="top" id="n5h-V7-STS"/>
356
-                            <constraint firstAttribute="trailingMargin" secondItem="bjC-jQ-LOw" secondAttribute="trailing" constant="-20" id="wJd-7K-65L"/>
357
-                            <constraint firstItem="Str-BX-Lky" firstAttribute="leading" secondItem="szY-tb-XAT" secondAttribute="leading" id="x2e-5M-bfE"/>
330
+                            <constraint firstItem="szY-tb-XAT" firstAttribute="bottom" secondItem="2I3-Nh-YZ5" secondAttribute="bottom" constant="6" id="PzK-nk-5ha"/>
331
+                            <constraint firstItem="2I3-Nh-YZ5" firstAttribute="leading" secondItem="szY-tb-XAT" secondAttribute="leading" id="juG-cf-sI2"/>
332
+                            <constraint firstItem="2I3-Nh-YZ5" firstAttribute="top" secondItem="szY-tb-XAT" secondAttribute="top" id="uNF-HK-KAi"/>
333
+                            <constraint firstAttribute="trailing" secondItem="2I3-Nh-YZ5" secondAttribute="trailing" id="w77-9w-TET"/>
358 334
                         </constraints>
359 335
                         <viewLayoutGuide key="safeArea" id="szY-tb-XAT"/>
360 336
                     </view>
@@ -368,26 +344,26 @@
368 344
                 </viewController>
369 345
                 <placeholder placeholderIdentifier="IBFirstResponder" id="i5Y-H4-CYK" userLabel="First Responder" sceneMemberID="firstResponder"/>
370 346
             </objects>
371
-            <point key="canvasLocation" x="143.19999999999999" y="926.08695652173924"/>
347
+            <point key="canvasLocation" x="-444" y="-164"/>
372 348
         </scene>
373 349
         <!--Mine Order View Controller-->
374 350
         <scene sceneID="3e4-t5-KsN">
375 351
             <objects>
376 352
                 <viewController storyboardIdentifier="MineOrderViewController" automaticallyAdjustsScrollViewInsets="NO" id="Rcb-gY-KGS" customClass="MineOrderViewController" customModule="Paiai_iOS" customModuleProvider="target" sceneMemberID="viewController">
377 353
                     <view key="view" contentMode="scaleToFill" id="1da-az-lxh">
378
-                        <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
354
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
379 355
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
380 356
                         <subviews>
381 357
                             <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" rowHeight="64" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="Ysr-aa-J9R">
382
-                                <rect key="frame" x="0.0" y="20" width="320" height="548"/>
358
+                                <rect key="frame" x="0.0" y="20" width="375" height="647"/>
383 359
                                 <color key="backgroundColor" red="0.94901960780000005" green="0.94901960780000005" blue="0.94901960780000005" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
384 360
                                 <color key="separatorColor" red="0.94117647058823528" green="0.94117647058823528" blue="0.94117647058823528" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
385 361
                                 <prototypes>
386
-                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="orderCell" rowHeight="64" id="b9t-RY-ZJI" customClass="OrderCell" customModule="Paiai_iOS" customModuleProvider="target">
387
-                                        <rect key="frame" x="0.0" y="28" width="320" height="64"/>
362
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="orderCell" rowHeight="64" id="b9t-RY-ZJI" customClass="OrderCell" customModule="Paiai_iOS" customModuleProvider="target">
363
+                                        <rect key="frame" x="0.0" y="28" width="375" height="64"/>
388 364
                                         <autoresizingMask key="autoresizingMask"/>
389 365
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="b9t-RY-ZJI" id="90v-hW-Nj2">
390
-                                            <rect key="frame" x="0.0" y="0.0" width="320" height="63.5"/>
366
+                                            <rect key="frame" x="0.0" y="0.0" width="375" height="63.5"/>
391 367
                                             <autoresizingMask key="autoresizingMask"/>
392 368
                                             <subviews>
393 369
                                                 <imageView clipsSubviews="YES" userInteractionEnabled="NO" tag="1001" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="默认头像" translatesAutoresizingMaskIntoConstraints="NO" id="PNO-iQ-jhe">
@@ -419,7 +395,7 @@
419 395
                                                     <nil key="highlightedColor"/>
420 396
                                                 </label>
421 397
                                                 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="+ 2.00" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CRI-rc-jfB">
422
-                                                    <rect key="frame" x="216.5" y="24.5" width="36.5" height="14.5"/>
398
+                                                    <rect key="frame" x="326.5" y="24.5" width="36.5" height="14.5"/>
423 399
                                                     <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
424 400
                                                     <fontDescription key="fontDescription" type="system" pointSize="12"/>
425 401
                                                     <color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
@@ -470,15 +446,13 @@
470 446
                         <viewLayoutGuide key="safeArea" id="Okl-5b-EeR"/>
471 447
                     </view>
472 448
                     <navigationItem key="navigationItem" id="Lzy-4o-Sr3"/>
473
-                    <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
474
-                    <size key="freeformSize" width="320" height="568"/>
475 449
                     <connections>
476 450
                         <outlet property="tableView" destination="Ysr-aa-J9R" id="Yuw-ab-oeJ"/>
477 451
                     </connections>
478 452
                 </viewController>
479 453
                 <placeholder placeholderIdentifier="IBFirstResponder" id="bkE-YW-tfe" sceneMemberID="firstResponder"/>
480 454
             </objects>
481
-            <point key="canvasLocation" x="1656.8" y="-102.54872563718142"/>
455
+            <point key="canvasLocation" x="1591" y="-164"/>
482 456
         </scene>
483 457
         <!--Mine View Controller-->
484 458
         <scene sceneID="wJG-wy-wnD">
@@ -562,7 +536,7 @@
562 536
                                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uFJ-qP-CrW">
563 537
                                                 <rect key="frame" x="0.0" y="0.0" width="300" height="84"/>
564 538
                                                 <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
565
-                                                <state key="normal" title="登出" image="注销切图">
539
+                                                <state key="normal" title="登出" image="BTN-logout">
566 540
                                                     <color key="titleColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
567 541
                                                 </state>
568 542
                                             </button>
@@ -611,18 +585,18 @@
611 585
                 </viewController>
612 586
                 <placeholder placeholderIdentifier="IBFirstResponder" id="89K-Cu-Ds9" userLabel="First Responder" sceneMemberID="firstResponder"/>
613 587
             </objects>
614
-            <point key="canvasLocation" x="2237.5999999999999" y="-102.09895052473765"/>
588
+            <point key="canvasLocation" x="2228" y="-174"/>
615 589
         </scene>
616 590
     </scenes>
617 591
     <resources>
592
+        <image name="BTN-logout" width="32" height="32"/>
618 593
         <image name="BTN-send" width="608" height="304"/>
619
-        <image name="Logo" width="140" height="140"/>
620 594
         <image name="about-contactUs" width="32" height="32"/>
621 595
         <image name="about-score" width="32" height="32"/>
622 596
         <image name="about-userAgreement" width="32" height="32"/>
623 597
         <image name="list-arrow" width="24" height="36"/>
598
+        <image name="logo" width="140" height="140"/>
624 599
         <image name="navigation-background" width="12" height="132"/>
625
-        <image name="注销切图" width="32" height="32"/>
626 600
         <image name="默认头像" width="240" height="240"/>
627 601
     </resources>
628 602
 </document>

+ 2 - 2
PaiAi/Paiai_iOS/App/Mine/MineCoordinator.swift

@@ -14,7 +14,7 @@ class MineCoordinator: Coordinator {
14 14
     
15 15
     let mineViewController: MineViewController
16 16
     let navigationController: UINavigationController
17
-    var childCoordinator = [String: Coordinator]()
17
+    var childCoordinator = [CoordinatorKey: Coordinator]()
18 18
 //    let shareUserInfoViewModel
19 19
     
20 20
     init(_ mineViewController: MineViewController, navigationController: UINavigationController) {
@@ -62,7 +62,7 @@ extension MineCoordinator: MineGroupViewModelDelegate {
62 62
     func didSelect(_ item: GroupItem) {
63 63
         let coordinator = GroupCoordinator(makeGroupViewController(item: item),
64 64
                                            navigationController: navigationController)
65
-        childCoordinator["group"] = coordinator
65
+        childCoordinator[.group] = coordinator
66 66
         navigationController.pushViewController(coordinator.groupViewController)
67 67
     }
68 68
 }

+ 14 - 8
PaiAi/Paiai_iOS/App/Mine/MineFeedbackViewController.swift

@@ -14,37 +14,43 @@ import PaiaiUIKit
14 14
 
15 15
 final class MineFeedbackViewController: UIViewController {
16 16
 
17
-    // MARK: Storyboard property
18 17
     @IBOutlet weak var textView: UITextView!
19 18
     @IBOutlet weak var sendBtn: UIButton!
20
-    fileprivate let disposeBag = DisposeBag()
21 19
     
20
+    fileprivate let disposeBag = DisposeBag()
22 21
     var feedbackAPI: FeedbackRemoteAPI!
23 22
     
24
-    // MARK: view function
25 23
     override func viewDidLoad() {
26 24
         super.viewDidLoad()
27 25
         title = "意见反馈"
28 26
         textView.placeholder = "您的建议是我们前进的动力"
27
+        textView.textContainerInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
29 28
         bindTextViewToSendBtn()
30 29
     }
30
+}
31 31
 
32
+/// storyboard button action
33
+extension MineFeedbackViewController {
32 34
     @IBAction func sendFeedBack() {
35
+        Toast.showActivity(message: "正在提交")
33 36
         feedbackAPI.submit(text: textView.text).subscribe(onCompleted: {[weak self] in
34 37
             guard let `self` = self else { return }
35
-            self.navigationController?.popViewController(animated: true)
38
+            Toast.hide()
36 39
             Toast.show(message: "感谢您的建议")
37
-        }) { (error) in
38
-            
39
-        }.disposed(by: disposeBag)
40
+            self.navigationController?.popViewController(animated: true)
41
+        }).disposed(by: disposeBag)
40 42
     }
43
+}
44
+
41 45
 
46
+/// storybaord gesture recognizer action
47
+extension MineFeedbackViewController {
42 48
     @IBAction func tap() {
43 49
         textView.resignFirstResponder()
44 50
     }
45 51
 }
46 52
 
47
-fileprivate extension MineFeedbackViewController {
53
+extension MineFeedbackViewController {
48 54
     func bindTextViewToSendBtn() {
49 55
         textView.rx.text
50 56
             .map {!($0?.isEmpty)!}

+ 4 - 3
PaiAi/Paiai_iOS/App/Mine/MineGroupViewController.swift

@@ -26,7 +26,6 @@ final class MineGroupViewController: UIViewController {
26 26
     // MARK: view function
27 27
     override func viewDidLoad() {
28 28
         super.viewDidLoad()
29
-        
30 29
         setup()
31 30
         binding()
32 31
         setNavigationBar()
@@ -43,7 +42,8 @@ final class MineGroupViewController: UIViewController {
43 42
     
44 43
     private func setupReloadControl() {
45 44
         tableView.addPullToRefresh(PullToRefresh()) {
46
-            [unowned self] in
45
+            [weak self] in
46
+            guard let `self` = self else { return }
47 47
             self.viewModel.reload()
48 48
         }
49 49
         tableView.startRefreshing(at: .top)
@@ -51,7 +51,8 @@ final class MineGroupViewController: UIViewController {
51 51
     
52 52
     private func setupLoadingControl() {
53 53
         tableView.addPullToRefresh(PullToRefresh(position: .bottom)) {
54
-            [unowned self] in
54
+            [weak self] in
55
+            guard let `self` = self else { return }
55 56
             self.viewModel.preload()
56 57
         }
57 58
     }

+ 8 - 10
PaiAi/Paiai_iOS/App/Mine/MineOrderViewController.swift

@@ -16,24 +16,20 @@ import PullToRefresh
16 16
 
17 17
 final class MineOrderViewController: UIViewController {
18 18
 
19
-    // MARK: Storyboard property
20 19
     @IBOutlet weak var tableView: UITableView!
21 20
     
22
-    // MARK: data property
23 21
     fileprivate let disposeBag = DisposeBag()
24 22
     var viewModel: MineOrderViewModel!
25 23
     
26
-    // MARK: view function
27 24
     override func viewDidLoad() {
28 25
         super.viewDidLoad()
29
-       
30 26
         setup()
31 27
         binding()
32 28
         setNavigationBar()
33 29
     }
34 30
     
35 31
     private func setNavigationBar() {
36
-        title = "我的照片群"
32
+        title = "订单记录"
37 33
     }
38 34
     
39 35
     private func setup() {
@@ -43,7 +39,8 @@ final class MineOrderViewController: UIViewController {
43 39
     
44 40
     private func setupReloadControl() {
45 41
         tableView.addPullToRefresh(PullToRefresh()) {
46
-            [unowned self] in
42
+            [weak self] in
43
+            guard let `self` = self else { return }
47 44
             self.viewModel.reload()
48 45
         }
49 46
         tableView.startRefreshing(at: .top)
@@ -51,17 +48,18 @@ final class MineOrderViewController: UIViewController {
51 48
     
52 49
     private func setupLoadingControl() {
53 50
         tableView.addPullToRefresh(PullToRefresh(position: .bottom)) {
54
-            [unowned self] in
51
+            [weak self] in
52
+            guard let `self` = self else { return }
55 53
             self.viewModel.preload()
56 54
         }
57 55
     }
58 56
 }
59 57
 
60
-///
58
+/// binding UI
61 59
 fileprivate extension MineOrderViewController {
62 60
     
63
-    var dataSource: RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, OrderItem>> {
64
-        return RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<Int, OrderItem>>(
61
+    var dataSource: RxTableViewSectionedReloadDataSource<AnimatableSectionModel<Int, OrderItem>> {
62
+        return RxTableViewSectionedReloadDataSource<AnimatableSectionModel<Int, OrderItem>>(
65 63
             configureCell: { (dataSource, tableView, indexPath, item) in
66 64
                 let cell = tableView.dequeueReusableCell(withIdentifier: "orderCell", for: indexPath) as! OrderCell
67 65
                 cell.setInfo(item)

+ 4 - 4
PaiAi/Paiai_iOS/App/PhotoCell.xib

@@ -59,7 +59,7 @@
59 59
                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="qGY-qB-XSl">
60 60
                         <rect key="frame" x="0.0" y="301" width="266" height="32"/>
61 61
                         <subviews>
62
-                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-赞" translatesAutoresizingMaskIntoConstraints="NO" id="UY4-Qk-Rt9">
62
+                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-thumbup" translatesAutoresizingMaskIntoConstraints="NO" id="UY4-Qk-Rt9">
63 63
                                 <rect key="frame" x="8" y="-2" width="36" height="36"/>
64 64
                             </imageView>
65 65
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Vth-es-l5X">
@@ -68,7 +68,7 @@
68 68
                                 <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
69 69
                                 <nil key="highlightedColor"/>
70 70
                             </label>
71
-                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-评论" translatesAutoresizingMaskIntoConstraints="NO" id="31M-cU-gad">
71
+                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-comment" translatesAutoresizingMaskIntoConstraints="NO" id="31M-cU-gad">
72 72
                                 <rect key="frame" x="64.5" y="-2" width="36" height="36"/>
73 73
                             </imageView>
74 74
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="0" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="koM-0x-z5o">
@@ -119,7 +119,7 @@
119 119
         </collectionViewCell>
120 120
     </objects>
121 121
     <resources>
122
-        <image name="icon-评论" width="36" height="36"/>
123
-        <image name="icon-赞" width="36" height="36"/>
122
+        <image name="icon-comment" width="36" height="36"/>
123
+        <image name="icon-thumbup" width="36" height="36"/>
124 124
     </resources>
125 125
 </document>

+ 131 - 98
PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetail.storyboard

@@ -63,7 +63,7 @@
63 63
                                                             <color key="textColor" red="0.98431372549999996" green="0.31372549020000001" blue="0.31372549020000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
64 64
                                                             <nil key="highlightedColor"/>
65 65
                                                         </label>
66
-                                                        <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="进入群" translatesAutoresizingMaskIntoConstraints="NO" id="70o-zv-I0l">
66
+                                                        <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="BTN-enterGroup" translatesAutoresizingMaskIntoConstraints="NO" id="70o-zv-I0l">
67 67
                                                             <rect key="frame" x="9" y="11.5" width="60" height="25"/>
68 68
                                                             <constraints>
69 69
                                                                 <constraint firstAttribute="height" constant="25" id="X8l-P5-3Rd"/>
@@ -421,13 +421,12 @@
421 421
                                             </userDefinedRuntimeAttribute>
422 422
                                         </userDefinedRuntimeAttributes>
423 423
                                     </textField>
424
-                                    <button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="oef-gW-sEK">
424
+                                    <button opaque="NO" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="oef-gW-sEK">
425 425
                                         <rect key="frame" x="303" y="10" width="60" height="36"/>
426
-                                        <color key="backgroundColor" red="0.9995151162147522" green="0.16799759864807129" blue="0.24112263321876526" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
427 426
                                         <constraints>
428 427
                                             <constraint firstAttribute="width" constant="60" id="lDb-Za-vrb"/>
429 428
                                         </constraints>
430
-                                        <state key="normal" title="发表">
429
+                                        <state key="normal" title="发表" backgroundImage="BTN-send">
431 430
                                             <color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
432 431
                                         </state>
433 432
                                         <connections>
@@ -460,7 +459,7 @@
460 459
                                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lCw-zE-NnH">
461 460
                                         <rect key="frame" x="0.0" y="0.0" width="375" height="48"/>
462 461
                                         <subviews>
463
-                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="购买-去水印" translatesAutoresizingMaskIntoConstraints="NO" id="pvN-rn-4Jn">
462
+                                            <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-purchase-watermark" translatesAutoresizingMaskIntoConstraints="NO" id="pvN-rn-4Jn">
464 463
                                                 <rect key="frame" x="123.5" y="0.0" width="48" height="48"/>
465 464
                                                 <constraints>
466 465
                                                     <constraint firstAttribute="height" constant="48" id="2VC-Nk-MXl"/>
@@ -514,6 +513,9 @@
514 513
                             <constraint firstItem="M7B-fx-M7f" firstAttribute="leading" secondItem="9gv-8b-ehH" secondAttribute="leading" id="svX-zh-yc8"/>
515 514
                         </constraints>
516 515
                         <viewLayoutGuide key="safeArea" id="9gv-8b-ehH"/>
516
+                        <connections>
517
+                            <outletCollection property="gestureRecognizers" destination="bqM-7G-5Nw" appends="YES" id="9Q0-1V-Lwz"/>
518
+                        </connections>
517 519
                     </view>
518 520
                     <size key="freeformSize" width="375" height="1000"/>
519 521
                     <connections>
@@ -527,6 +529,7 @@
527 529
                         <outlet property="enterGroupView" destination="gSr-Cm-y1W" id="bNT-Z4-eOG"/>
528 530
                         <outlet property="groupAvatar" destination="nng-M9-7cj" id="Y42-Tc-QnV"/>
529 531
                         <outlet property="groupName" destination="XM7-FX-tOk" id="ifP-h1-72j"/>
532
+                        <outlet property="keyboardGestureRcognizer" destination="bqM-7G-5Nw" id="uUS-Ox-osk"/>
530 533
                         <outlet property="photoCollectionView" destination="dtf-M8-otl" id="VlY-wa-ekc"/>
531 534
                         <outlet property="photoTime" destination="QpI-Mp-URP" id="rJM-TG-fZW"/>
532 535
                         <outlet property="sendBtn" destination="oef-gW-sEK" id="3RV-uD-3q1"/>
@@ -541,12 +544,17 @@
541 544
                     </connections>
542 545
                 </viewController>
543 546
                 <placeholder placeholderIdentifier="IBFirstResponder" id="MFn-pn-5Jb" userLabel="First Responder" sceneMemberID="firstResponder"/>
544
-                <tapGestureRecognizer id="thN-TP-atT" userLabel="purchaseGestureRecognizer">
547
+                <tapGestureRecognizer enabled="NO" id="bqM-7G-5Nw" userLabel="keyboard Gesture Recognizer">
548
+                    <connections>
549
+                        <action selector="recyclingKeyboard:" destination="qsT-Pc-Bhh" id="BWK-9f-gfv"/>
550
+                    </connections>
551
+                </tapGestureRecognizer>
552
+                <tapGestureRecognizer id="thN-TP-atT" userLabel="purchase Gesture Recognizer">
545 553
                     <connections>
546 554
                         <action selector="purchase:" destination="qsT-Pc-Bhh" id="qjs-Ot-XwA"/>
547 555
                     </connections>
548 556
                 </tapGestureRecognizer>
549
-                <tapGestureRecognizer id="EHE-XX-kIE" userLabel="enterGroupGestureRecognizer">
557
+                <tapGestureRecognizer id="EHE-XX-kIE" userLabel="enter Group Gesture Recognizer">
550 558
                     <connections>
551 559
                         <action selector="enterGroup:" destination="qsT-Pc-Bhh" id="dZE-ok-iUM"/>
552 560
                     </connections>
@@ -554,122 +562,146 @@
554 562
             </objects>
555 563
             <point key="canvasLocation" x="-1452" y="1137.9310344827586"/>
556 564
         </scene>
557
-        <!--ShareController-->
565
+        <!--Share View Controller-->
558 566
         <scene sceneID="UTe-rv-qoO">
559 567
             <objects>
560
-                <viewController storyboardIdentifier="ShareController" automaticallyAdjustsScrollViewInsets="NO" id="KnW-jg-4H5" userLabel="ShareController" customClass="ShareController" customModule="Paiai_iOS" customModuleProvider="target" sceneMemberID="viewController">
568
+                <viewController storyboardIdentifier="ShareViewController" automaticallyAdjustsScrollViewInsets="NO" id="KnW-jg-4H5" customClass="ShareViewController" customModule="Paiai_iOS" customModuleProvider="target" sceneMemberID="viewController">
561 569
                     <view key="view" contentMode="scaleToFill" id="rN5-Zb-vwm">
562 570
                         <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
563 571
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
564 572
                         <subviews>
565
-                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xUW-ue-yp5">
573
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="edT-EA-xhZ" userLabel="Share View">
566 574
                                 <rect key="frame" x="0.0" y="463" width="375" height="77"/>
567 575
                                 <subviews>
568
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="qpb-ag-Zb8">
569
-                                        <rect key="frame" x="30.5" y="0.0" width="54" height="54"/>
576
+                                    <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="itC-HJ-ZaT" userLabel="circle">
577
+                                        <rect key="frame" x="30.5" y="0.0" width="54" height="71"/>
578
+                                        <subviews>
579
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yKG-rx-pgX">
580
+                                                <rect key="frame" x="0.0" y="0.0" width="54" height="54"/>
581
+                                                <constraints>
582
+                                                    <constraint firstAttribute="width" constant="54" id="CuL-Dq-ZdA"/>
583
+                                                    <constraint firstAttribute="height" constant="54" id="N1z-wg-bWj"/>
584
+                                                </constraints>
585
+                                                <state key="normal" image="share-wxCircle"/>
586
+                                                <connections>
587
+                                                    <action selector="shareToFriendCircle" destination="KnW-jg-4H5" eventType="touchUpInside" id="l8P-Cd-0ds"/>
588
+                                                </connections>
589
+                                            </button>
590
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="朋友圈" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3pg-qO-r4l">
591
+                                                <rect key="frame" x="5.5" y="54" width="43" height="17"/>
592
+                                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
593
+                                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
594
+                                                <nil key="highlightedColor"/>
595
+                                            </label>
596
+                                        </subviews>
570 597
                                         <constraints>
571
-                                            <constraint firstAttribute="height" constant="54" id="1zd-z7-bRA"/>
572
-                                            <constraint firstAttribute="width" constant="54" id="la0-N0-BGD"/>
598
+                                            <constraint firstAttribute="width" constant="54" id="7c7-Ce-enL"/>
573 599
                                         </constraints>
574
-                                        <state key="normal" image="分享-朋友圈"/>
575
-                                        <connections>
576
-                                            <action selector="shareToFriendCircle" destination="KnW-jg-4H5" eventType="touchUpInside" id="3as-uU-Hcb"/>
577
-                                        </connections>
578
-                                    </button>
579
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="6ux-OL-8wy">
580
-                                        <rect key="frame" x="117" y="0.0" width="54" height="54"/>
600
+                                    </stackView>
601
+                                    <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="W6V-MR-s2s" userLabel="weixin">
602
+                                        <rect key="frame" x="117" y="0.0" width="54" height="71"/>
603
+                                        <subviews>
604
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WHf-tp-9sX">
605
+                                                <rect key="frame" x="0.0" y="0.0" width="54" height="54"/>
606
+                                                <constraints>
607
+                                                    <constraint firstAttribute="height" constant="54" id="VCa-wM-G0W"/>
608
+                                                    <constraint firstAttribute="width" constant="54" id="bOu-A0-deg"/>
609
+                                                </constraints>
610
+                                                <state key="normal" image="share-wx"/>
611
+                                                <connections>
612
+                                                    <action selector="shareToFriendCircle" destination="KnW-jg-4H5" eventType="touchUpInside" id="HIE-st-eD9"/>
613
+                                                </connections>
614
+                                            </button>
615
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="微信" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ju7-a4-MAb" userLabel="微信">
616
+                                                <rect key="frame" x="12.5" y="54" width="29" height="17"/>
617
+                                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
618
+                                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
619
+                                                <nil key="highlightedColor"/>
620
+                                            </label>
621
+                                        </subviews>
581 622
                                         <constraints>
582
-                                            <constraint firstAttribute="width" constant="54" id="5X9-C3-GLj"/>
583
-                                            <constraint firstAttribute="height" constant="54" id="8b9-pJ-MY4"/>
623
+                                            <constraint firstAttribute="width" constant="54" id="U1a-2q-73r"/>
584 624
                                         </constraints>
585
-                                        <state key="normal" image="分享-微信好友"/>
586
-                                        <connections>
587
-                                            <action selector="shareToWei" destination="KnW-jg-4H5" eventType="touchUpInside" id="6Sc-0e-z9l"/>
588
-                                        </connections>
589
-                                    </button>
590
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="x2h-L3-H9s">
591
-                                        <rect key="frame" x="285.5" y="0.0" width="54" height="54"/>
625
+                                    </stackView>
626
+                                    <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="KU1-aO-nLf" userLabel="QQ">
627
+                                        <rect key="frame" x="202" y="0.0" width="54" height="71"/>
628
+                                        <subviews>
629
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="kgp-ou-XXF">
630
+                                                <rect key="frame" x="0.0" y="0.0" width="54" height="54"/>
631
+                                                <constraints>
632
+                                                    <constraint firstAttribute="width" constant="54" id="HIs-RN-iJa"/>
633
+                                                    <constraint firstAttribute="height" constant="54" id="sjs-5I-q9G"/>
634
+                                                </constraints>
635
+                                                <state key="normal" image="share-QQ"/>
636
+                                                <connections>
637
+                                                    <action selector="shareToFriendCircle" destination="KnW-jg-4H5" eventType="touchUpInside" id="uxZ-de-KlE"/>
638
+                                                </connections>
639
+                                            </button>
640
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="QQ" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cQk-kV-x1B" userLabel="QQ">
641
+                                                <rect key="frame" x="16.5" y="54" width="21.5" height="17"/>
642
+                                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
643
+                                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
644
+                                                <nil key="highlightedColor"/>
645
+                                            </label>
646
+                                        </subviews>
592 647
                                         <constraints>
593
-                                            <constraint firstAttribute="width" constant="54" id="JUP-IW-DiC"/>
594
-                                            <constraint firstAttribute="height" constant="54" id="xGJ-At-rzn"/>
648
+                                            <constraint firstAttribute="width" constant="54" id="Meq-Td-X06"/>
595 649
                                         </constraints>
596
-                                        <state key="normal" image="分享-微博"/>
597
-                                        <connections>
598
-                                            <action selector="shareToWeibo" destination="KnW-jg-4H5" eventType="touchUpInside" id="VYj-hh-MyW"/>
599
-                                        </connections>
600
-                                    </button>
601
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="yqF-ZW-9kd">
602
-                                        <rect key="frame" x="202" y="0.0" width="54" height="54"/>
650
+                                    </stackView>
651
+                                    <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="ZLk-gf-Jzh" userLabel="weibo">
652
+                                        <rect key="frame" x="285.5" y="0.0" width="54" height="71"/>
653
+                                        <subviews>
654
+                                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="uCq-aJ-DOY">
655
+                                                <rect key="frame" x="0.0" y="0.0" width="54" height="54"/>
656
+                                                <constraints>
657
+                                                    <constraint firstAttribute="width" constant="54" id="9PQ-od-zwh"/>
658
+                                                    <constraint firstAttribute="height" constant="54" id="Dd2-ob-7nA"/>
659
+                                                </constraints>
660
+                                                <state key="normal" image="share-weibo"/>
661
+                                                <connections>
662
+                                                    <action selector="shareToFriendCircle" destination="KnW-jg-4H5" eventType="touchUpInside" id="inK-7r-8gZ"/>
663
+                                                </connections>
664
+                                            </button>
665
+                                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="微博" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ycS-qw-cbn" userLabel="微博">
666
+                                                <rect key="frame" x="12.5" y="54" width="29" height="17"/>
667
+                                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
668
+                                                <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
669
+                                                <nil key="highlightedColor"/>
670
+                                            </label>
671
+                                        </subviews>
603 672
                                         <constraints>
604
-                                            <constraint firstAttribute="height" constant="54" id="3gE-we-sHc"/>
605
-                                            <constraint firstAttribute="width" constant="54" id="j1v-So-HZy"/>
673
+                                            <constraint firstAttribute="width" constant="54" id="JRS-hW-4fd"/>
606 674
                                         </constraints>
607
-                                        <state key="normal" image="分享-QQ"/>
608
-                                        <connections>
609
-                                            <action selector="shareToQQ" destination="KnW-jg-4H5" eventType="touchUpInside" id="AUu-PL-Vdh"/>
610
-                                        </connections>
611
-                                    </button>
612
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="朋友圈" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nO4-Ve-OiO">
613
-                                        <rect key="frame" x="36" y="60" width="43" height="17"/>
614
-                                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
615
-                                        <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
616
-                                        <nil key="highlightedColor"/>
617
-                                    </label>
618
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="微信" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KS7-62-qGm">
619
-                                        <rect key="frame" x="129.5" y="60" width="29" height="17"/>
620
-                                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
621
-                                        <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
622
-                                        <nil key="highlightedColor"/>
623
-                                    </label>
624
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="QQ" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="HHz-QK-Fr2">
625
-                                        <rect key="frame" x="218" y="60" width="22" height="17"/>
626
-                                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
627
-                                        <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
628
-                                        <nil key="highlightedColor"/>
629
-                                    </label>
630
-                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="微博" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="xa5-ke-ek6">
631
-                                        <rect key="frame" x="298" y="60" width="29" height="17"/>
632
-                                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
633
-                                        <color key="textColor" red="0.59999999999999998" green="0.59999999999999998" blue="0.59999999999999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
634
-                                        <nil key="highlightedColor"/>
635
-                                    </label>
675
+                                    </stackView>
636 676
                                 </subviews>
637 677
                                 <constraints>
638
-                                    <constraint firstItem="HHz-QK-Fr2" firstAttribute="centerX" secondItem="yqF-ZW-9kd" secondAttribute="centerX" id="7l8-1r-eQh"/>
639
-                                    <constraint firstAttribute="bottom" secondItem="HHz-QK-Fr2" secondAttribute="bottom" id="FSC-Ek-9t8"/>
640
-                                    <constraint firstItem="yqF-ZW-9kd" firstAttribute="centerY" secondItem="qpb-ag-Zb8" secondAttribute="centerY" id="KPI-J0-KS4"/>
641
-                                    <constraint firstItem="xa5-ke-ek6" firstAttribute="centerX" secondItem="x2h-L3-H9s" secondAttribute="centerX" id="M27-U4-Q3M"/>
642
-                                    <constraint firstAttribute="height" constant="77" id="N2d-i8-gd3"/>
643
-                                    <constraint firstItem="yqF-ZW-9kd" firstAttribute="centerX" secondItem="xUW-ue-yp5" secondAttribute="centerX" multiplier="220:180" id="NbH-9w-UIS"/>
644
-                                    <constraint firstAttribute="bottom" secondItem="KS7-62-qGm" secondAttribute="bottom" id="PSC-uY-GlG"/>
645
-                                    <constraint firstItem="x2h-L3-H9s" firstAttribute="centerY" secondItem="qpb-ag-Zb8" secondAttribute="centerY" id="X1L-d4-RO3"/>
646
-                                    <constraint firstItem="qpb-ag-Zb8" firstAttribute="top" secondItem="xUW-ue-yp5" secondAttribute="top" id="Xhp-xq-TAQ"/>
647
-                                    <constraint firstItem="6ux-OL-8wy" firstAttribute="centerX" secondItem="xUW-ue-yp5" secondAttribute="centerX" multiplier="138:180" id="b7V-Ap-t1L"/>
648
-                                    <constraint firstAttribute="bottom" secondItem="nO4-Ve-OiO" secondAttribute="bottom" id="dJP-qK-Tlu"/>
649
-                                    <constraint firstItem="KS7-62-qGm" firstAttribute="centerX" secondItem="6ux-OL-8wy" secondAttribute="centerX" id="eHD-Mp-ViT"/>
650
-                                    <constraint firstItem="nO4-Ve-OiO" firstAttribute="centerX" secondItem="qpb-ag-Zb8" secondAttribute="centerX" id="gw3-SW-dNJ"/>
651
-                                    <constraint firstItem="x2h-L3-H9s" firstAttribute="centerX" secondItem="xUW-ue-yp5" secondAttribute="centerX" multiplier="300:180" id="rbh-jj-rpj"/>
652
-                                    <constraint firstItem="qpb-ag-Zb8" firstAttribute="centerX" secondItem="xUW-ue-yp5" secondAttribute="centerX" multiplier="55:180" id="sWn-3o-xfe"/>
653
-                                    <constraint firstAttribute="bottom" secondItem="xa5-ke-ek6" secondAttribute="bottom" id="uCt-id-dos"/>
654
-                                    <constraint firstItem="6ux-OL-8wy" firstAttribute="centerY" secondItem="qpb-ag-Zb8" secondAttribute="centerY" id="xcU-1M-cr8"/>
678
+                                    <constraint firstItem="KU1-aO-nLf" firstAttribute="top" secondItem="edT-EA-xhZ" secondAttribute="top" id="2U4-8e-O3g"/>
679
+                                    <constraint firstItem="ZLk-gf-Jzh" firstAttribute="centerX" secondItem="edT-EA-xhZ" secondAttribute="centerX" multiplier="300:180" id="3Kp-5r-ImR"/>
680
+                                    <constraint firstItem="itC-HJ-ZaT" firstAttribute="centerX" secondItem="edT-EA-xhZ" secondAttribute="centerX" multiplier="55:180" id="7D5-Uy-aAS"/>
681
+                                    <constraint firstItem="W6V-MR-s2s" firstAttribute="top" secondItem="edT-EA-xhZ" secondAttribute="top" id="B2o-vs-NbY"/>
682
+                                    <constraint firstItem="KU1-aO-nLf" firstAttribute="centerX" secondItem="edT-EA-xhZ" secondAttribute="centerX" multiplier="220:180" id="HbQ-Ef-QBp"/>
683
+                                    <constraint firstItem="ZLk-gf-Jzh" firstAttribute="top" secondItem="edT-EA-xhZ" secondAttribute="top" id="NSS-yv-eAq"/>
684
+                                    <constraint firstItem="itC-HJ-ZaT" firstAttribute="top" secondItem="edT-EA-xhZ" secondAttribute="top" id="fRA-ze-0tQ"/>
685
+                                    <constraint firstAttribute="height" constant="77" id="q4w-sh-fN4"/>
686
+                                    <constraint firstItem="W6V-MR-s2s" firstAttribute="centerX" secondItem="edT-EA-xhZ" secondAttribute="centerX" multiplier="138:180" id="tOg-mT-rNp"/>
655 687
                                 </constraints>
656 688
                             </view>
657 689
                         </subviews>
658 690
                         <gestureRecognizers/>
659 691
                         <constraints>
660
-                            <constraint firstItem="xUW-ue-yp5" firstAttribute="leading" secondItem="C6P-7J-fWs" secondAttribute="leading" id="Afy-jR-Jec"/>
661
-                            <constraint firstItem="C6P-7J-fWs" firstAttribute="bottom" secondItem="xUW-ue-yp5" secondAttribute="bottom" constant="127" id="hco-RD-Kle"/>
662
-                            <constraint firstItem="C6P-7J-fWs" firstAttribute="trailing" secondItem="xUW-ue-yp5" secondAttribute="trailing" id="lAd-Wf-RcE"/>
692
+                            <constraint firstItem="edT-EA-xhZ" firstAttribute="trailing" secondItem="C6P-7J-fWs" secondAttribute="trailing" id="6h4-ug-H2a"/>
693
+                            <constraint firstItem="edT-EA-xhZ" firstAttribute="leading" secondItem="C6P-7J-fWs" secondAttribute="leading" id="RS3-mc-Bi6"/>
694
+                            <constraint firstItem="C6P-7J-fWs" firstAttribute="bottom" secondItem="edT-EA-xhZ" secondAttribute="bottom" constant="127" id="iF3-AG-M9e"/>
663 695
                         </constraints>
664 696
                         <viewLayoutGuide key="safeArea" id="C6P-7J-fWs"/>
665 697
                     </view>
666 698
                     <connections>
667
-                        <outlet property="shareView" destination="xUW-ue-yp5" id="I5g-Zk-9uW"/>
699
+                        <outlet property="shareView" destination="edT-EA-xhZ" id="DNu-Ue-V2y"/>
668 700
                     </connections>
669 701
                 </viewController>
670 702
                 <placeholder placeholderIdentifier="IBFirstResponder" id="9LO-35-FRH" userLabel="First Responder" sceneMemberID="firstResponder"/>
671 703
             </objects>
672
-            <point key="canvasLocation" x="-513" y="1287"/>
704
+            <point key="canvasLocation" x="-73" y="469"/>
673 705
         </scene>
674 706
         <!--PhotoPreviewViewController-->
675 707
         <scene sceneID="yhk-2u-fiu">
@@ -779,20 +811,21 @@
779 811
     <resources>
780 812
         <image name="BTN-comment" width="138" height="138"/>
781 813
         <image name="BTN-download" width="96" height="96"/>
814
+        <image name="BTN-enterGroup" width="114" height="60"/>
782 815
         <image name="BTN-rotate" width="96" height="96"/>
816
+        <image name="BTN-send" width="608" height="304"/>
783 817
         <image name="BTN-share" width="138" height="138"/>
784 818
         <image name="BTN-thumbup" width="192" height="192"/>
785 819
         <image name="defaultAvatar" width="240" height="240"/>
786 820
         <image name="icon-comment" width="36" height="36"/>
821
+        <image name="icon-purchase-watermark" width="96" height="96"/>
787 822
         <image name="icon-thumbup" width="36" height="36"/>
788 823
         <image name="icon-time" width="36" height="36"/>
789 824
         <image name="list-arrow" width="24" height="36"/>
790 825
         <image name="navigation-back" width="36" height="72"/>
791
-        <image name="分享-QQ" width="162" height="162"/>
792
-        <image name="分享-微信好友" width="162" height="162"/>
793
-        <image name="分享-微博" width="162" height="162"/>
794
-        <image name="分享-朋友圈" width="162" height="162"/>
795
-        <image name="购买-去水印" width="96" height="96"/>
796
-        <image name="进入群" width="114" height="60"/>
826
+        <image name="share-QQ" width="162" height="162"/>
827
+        <image name="share-weibo" width="162" height="162"/>
828
+        <image name="share-wx" width="162" height="162"/>
829
+        <image name="share-wxCircle" width="162" height="162"/>
797 830
     </resources>
798 831
 </document>

+ 2 - 2
PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailCoordinator.swift

@@ -14,7 +14,7 @@ final class PhotoDetailCoordinator: Coordinator {
14 14
     let photoDetailViewController: PhotoDetailViewController
15 15
     let shareListViewModel: PhotoDetailListViewModel
16 16
     
17
-    fileprivate var coordinators = [String: Coordinator]()
17
+    fileprivate var coordinators = [CoordinatorKey: Coordinator]()
18 18
     
19 19
     init(_ photoDetailVC: PhotoDetailViewController,
20 20
          nav: UINavigationController,
@@ -42,7 +42,7 @@ extension PhotoDetailCoordinator: PhotoDetailViewModelDelegate {
42 42
         vc.viewModel = GroupViewModel(groupItem: item)
43 43
         let coordinator = GroupCoordinator(vc,
44 44
                                            navigationController: navigationController)
45
-        coordinators["group"] = coordinator
45
+        coordinators[.group] = coordinator
46 46
         
47 47
         navigationController.pushViewController(vc)
48 48
     }

+ 13 - 12
PaiAi/Paiai_iOS/App/PhotoDetail/PhotoDetailViewController.swift

@@ -44,6 +44,7 @@ final class PhotoDetailViewController: UIViewController {
44 44
     @IBOutlet weak var waterMarkImage: UIImageView!
45 45
     @IBOutlet weak var waterMarkLabel: UILabel!
46 46
     
47
+    @IBOutlet var keyboardGestureRcognizer: UITapGestureRecognizer!
47 48
     @IBOutlet weak var thumbupViewHeightConstraint: NSLayoutConstraint!
48 49
     @IBOutlet weak var commentEditYConstraint: NSLayoutConstraint!
49 50
     
@@ -56,6 +57,7 @@ final class PhotoDetailViewController: UIViewController {
56 57
     // MARK: view function
57 58
     override func viewDidLoad() {
58 59
         super.viewDidLoad()
60
+        title = "详情"
59 61
         binding()
60 62
         setup()
61 63
     }
@@ -80,19 +82,13 @@ final class PhotoDetailViewController: UIViewController {
80 82
     }
81 83
 }
82 84
 
83
-//MARK textField delegate
84
-extension PhotoDetailViewController: UIGestureRecognizerDelegate {
85
-    // MARK: textField
86
-
87
-    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
88
-        return commentTextField.isFirstResponder
89
-    }
90
-    
91
-}
92
-
93
-
94 85
 /// bind storyboard gesture action
95 86
 extension PhotoDetailViewController {
87
+    
88
+    @IBAction func recyclingKeyboard(_ sender: UITapGestureRecognizer) {
89
+        commentTextField.resignFirstResponder()
90
+    }
91
+    
96 92
     @IBAction func purchase(_ sender: UITapGestureRecognizer) {
97 93
         
98 94
     }
@@ -105,7 +101,7 @@ extension PhotoDetailViewController {
105 101
 /// bind storyboard button action
106 102
 extension PhotoDetailViewController {
107 103
     @IBAction func share() {
108
-        let ctl = UIStoryboard.photoDetail.instantiateController(ShareController.self)
104
+        let ctl = UIStoryboard.photoDetail.instantiateController(ShareViewController.self)
109 105
         ctl.shareContent = "我使用拍爱分享了一张美图,你也快来试试吧"
110 106
         //        ctl.shareImgUrlThumb = datas[currentPhotoIndex].photo_thumbnail_url
111 107
         //        ctl.shareUrl = datas[currentPhotoIndex].photo_share_url
@@ -283,6 +279,9 @@ extension PhotoDetailViewController {
283 279
             .notification(UIResponder.keyboardWillShowNotification)
284 280
             .takeUntil(self.rx.deallocated)
285 281
             .subscribe { [unowned self] notification in
282
+                
283
+                self.keyboardGestureRcognizer.isEnabled = true
284
+                
286 285
                 guard let userInfo = notification.element?.userInfo,
287 286
                     let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect,
288 287
                     let timeInterval = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval,
@@ -301,6 +300,8 @@ extension PhotoDetailViewController {
301 300
             .notification(UIResponder.keyboardWillHideNotification)
302 301
             .takeUntil(self.rx.deallocated)
303 302
             .subscribe { [unowned self] notification in
303
+                self.keyboardGestureRcognizer.isEnabled = false
304
+                
304 305
                 guard let userInfo = notification.element?.userInfo,
305 306
                     let timeInterval = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval,
306 307
                     let curve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? Int

+ 12 - 12
PaiAi/Paiai_iOS/App/PhotoDetail/ShareController.swift

@@ -1,5 +1,5 @@
1 1
 //
2
-//  ShareController.swift
2
+//  ShareViewController.swift
3 3
 //  PaiAi
4 4
 //
5 5
 //  Created by zhengjianfei on 16/4/7.
@@ -10,24 +10,24 @@ import UIKit
10 10
 import PaiaiDataKit
11 11
 import PaiaiUIKit
12 12
 
13
-final class ShareController: UIViewController {
13
+final class ShareViewController: AlertViewController {
14 14
 
15
-    // MARK: Storyboard property
16 15
     @IBOutlet weak var shareView: UIView!
17
-
16
+    
17
+    override var animationView: UIView? {
18
+        return shareView
19
+    }
20
+    
21
+    override var style: AlertViewController.Style {
22
+        return .actionSheet
23
+    }
24
+    
18 25
    // MARK: parameter property
19 26
     var shareContent: String = ""
20 27
     var shareImg: UIImage?
21 28
     lazy var shareImgUrlThumb: String = ""
22 29
     lazy var shareUrl: String = ""
23
-//    let transitioning = FFTransitioning(alertStyle: .actionSheet)
24
-
25
-    required init?(coder aDecoder: NSCoder) {
26
-        super.init(coder: aDecoder)
27
-//        transitioningDelegate = transitioning
28
-    }
29
-
30
-    // MARK: view function
30
+    
31 31
     override func viewDidLoad() {
32 32
         super.viewDidLoad()
33 33
         let imageView = UIImageView()

+ 0 - 29
PaiAi/Paiai_iOS/App/PhotoDetail/ShareView.swift

@@ -1,29 +0,0 @@
1
-//
2
-//  ShareView.swift
3
-//  Paiai_iOS
4
-//
5
-//  Created by ffib on 2019/3/21.
6
-//  Copyright © 2019 yb. All rights reserved.
7
-//
8
-
9
-import UIKit
10
-
11
-class ShareView: UIView {
12
-    
13
-}
14
-
15
-
16
-
17
-extension ShareView {
18
-    
19
-    func activateConstraints() {
20
-        
21
-    }
22
-    
23
-    func activateConstraintsShareView() {
24
-        guard let superView = superview else { return }
25
-        
26
-        self.translatesAutoresizingMaskIntoConstraints = false
27
-        
28
-    }
29
-}